2012-03-12 103 views
3

在編譯之前可以在C文件中添加GDB斷點嗎?目前,我必須通過GDB編譯後指定斷點。在C文件中設置GDB斷點

我正在尋找類似於JavaScript的debugger;聲明的內容。

回答

4

不是這樣,但你可以插入一些有用的函數調用:

一種選擇是創建一個功能:

void break_here() 
{ 
    /* do nothing */ 
} 

然後在任何你想要的地方調用它,但要小心它不會被內聯(放在不同的文件中,或添加一個「noinline」屬性)。

然後,在GDB中,只需在break_here上設置一個斷點,就完成了。如果您覺得每次都要設置該斷點,可以在主目錄或包含斷點命令的當前工作目錄中創建一個名爲.gdbinit的文件。

在Linux上工作的另一種方法是使用一個信號:

raise (SIGUSR1); 

你可以使用任何你喜歡的信號,但最好使用一個不殺你的程序(雖然你可以配置GDB如果你願意,不要將它們傳遞給你的程序)。

+0

謝謝!你知道'.gdbinit'如何與Cygwin一起工作嗎? – Randomblue 2012-03-12 17:27:08

+0

完全一樣,我想,雖然我依稀記得Windows有不同的文件名? GDB使用你的'$ HOME'變量作爲主目錄的位置。 – ams 2012-03-12 17:30:20

+0

啊,只是查了一下:Windows *可能會使用gdb.ini作爲文件名,但它只是一個GDB腳本。 – ams 2012-03-12 17:31:43

2

我沒有意識到直接設置斷點的方法,但GDB會捕獲中斷,所以這是一種可能的解決方案。

這樣的事情應該工作。你需要包括signal.h中:

raise(SIGABRT); 
0

在Linux上,這我假設你在,因爲你用gdb你可以做一個腳本,無論你需要一個斷點與意見做代碼

#!/bin/bash 
#debug: Script to run programs in gdb with comments to specify break 
points 
echo "file ./a.out" > run 
grep -nrIH "/\*GDB\*/" | 
    sed "s/\(^[^:]\+:[^:]\+\):.*$/\1/g" | 
    awk '{print "b" " " $1 }'| 
    grep -v $(echo $0| sed "s/.*\///g") >> run 
gdb --init-command ./run -ex=r 
exit 0 

然後,就添加/*GDB*/,腳本將使用grep查找帶有這些註釋的行號和文件,並在每個找到它們的文件的每一行上設置一個斷點,然後啓動gdb