我有一個應用程序。我有源代碼(C)。無論如何,我可以編譯它。添加我想要的任何工具。等等。但是,我不想用一堆printf來哄騙源代碼。我希望能夠生成某種類型的日誌,以顯示特定值(例如全局結構的某些成員)是否寫入(其值發生更改)。我希望能夠顯示源文件和行號,以及新舊值。幫助gdb跟蹤(或類似)
我也想能夠通過名稱而不是地址來指定值。但地址確定。如果我可以指定一個函數本地的值,則爲獎勵點。
我還在摸索着想弄清楚gdb的跟蹤命令。任何幫助是極大的讚賞。謝謝。
我有一個應用程序。我有源代碼(C)。無論如何,我可以編譯它。添加我想要的任何工具。等等。但是,我不想用一堆printf來哄騙源代碼。我希望能夠生成某種類型的日誌,以顯示特定值(例如全局結構的某些成員)是否寫入(其值發生更改)。我希望能夠顯示源文件和行號,以及新舊值。幫助gdb跟蹤(或類似)
我也想能夠通過名稱而不是地址來指定值。但地址確定。如果我可以指定一個函數本地的值,則爲獎勵點。
我還在摸索着想弄清楚gdb的跟蹤命令。任何幫助是極大的讚賞。謝謝。
謝謝@derobert和@peter!我終於回到了這個,這個:
break main
commands
watch somevar
commands
cont
end
cont
end
run
有竅門。這適用於「somevar」是全局的,或本地的「main」。如果「somevar」是另一個函數的本地代碼,只需用上面的函數名替換「main」。
在文件中把這些命令(例如「gdbscript」),並運行GDB,如:
gdb -x gdbscript a.out
首先,您需要確保使用調試符號編譯您的程序,並且可能不進行優化以使gdb最有用。對於gcc,這將是-g -O0
。
其次,您要查找的功能不是跟蹤,它的觀察點。
(gdb) help watch
Set a watchpoint for an expression.
A watchpoint stops execution of your program whenever the value of
an expression changes.
所以,對於一些示例代碼:
int main() {
int a;
a = 1;
a = 2;
return 0;
}
那麼你就可以在其上運行GDB,並且:
(gdb) b main
Breakpoint 1 at 0x80483a5: file test.c, line 4.
(gdb) run
Starting program: /tmp/test
Breakpoint 1, main() at test.c:4
4 a = 1;
(gdb) watch a
Hardware watchpoint 2: a
(gdb) c
Continuing.
Hardware watchpoint 2: a
Old value = -1207552288
New value = 2
main() at test.c:8
8 return 0;
它的工作稍微好笑由於是在棧上,不是記憶。如果優化開始,它會更少工作:a會被優化。
如前所述,您需要爲變量設置一個觀察點。
的使用「命令」命令
(gdb) help commands
Set commands to be executed when a breakpoint is hit.
Give breakpoint number as argument after "commands".
With no argument, the targeted breakpoint is the last one set.
The commands themselves follow starting on the next line.
Type a line containing "end" to indicate the end of them.
Give "silent" as the first line to make the breakpoint silent;
then no output is printed when it is hit, except what the commands print.
所以,找到watch命令觀察點數量,並做到這一點(假設你的手錶是在第二個破發)
(gdp) commands 2
> print a
> cont
> end
假設a是你想要的變量。如果您對gdb給出的輸出感到滿意,您可以省略打印行。
您還可以使用原始斷點中的命令來設置觀察點並繼續。
嘗試宣告了'''如揮發性int',這可能使例子更好地工作。 – caf 2009-08-26 00:29:30
謝謝德羅伯特。根據我對手錶的瞭解,他們導致程序執行停止,直到用戶「繼續」。我敢肯定,我可以寫一個期望腳本來做到這一點,但有沒有辦法從gdb內部自動完成此操作? – tvaughan 2009-08-26 18:16:44
@tvaughan:我不知道在gdb中使用自動方法。 – derobert 2009-08-27 04:28:15