一定的斷點我正在尋找一種方式做一些動作時,一個特定的斷點在gdb命中。做具體行動時,在gdb
基本上我有我的一些程序memleak。當malloc和free函數命中時,我需要進入函數(step)並且收集一些基本信息,比如addr和size(基本上打印那裏的值)。一旦完成恢復我的程序。
我們有什麼好的辦法做到這一點?
一定的斷點我正在尋找一種方式做一些動作時,一個特定的斷點在gdb命中。做具體行動時,在gdb
基本上我有我的一些程序memleak。當malloc和free函數命中時,我需要進入函數(step)並且收集一些基本信息,比如addr和size(基本上打印那裏的值)。一旦完成恢復我的程序。
我們有什麼好的辦法做到這一點?
例如,這裏是你如何使用斷點命令在進入打印x的值給foo每當x爲正。
break foo if x>0
commands
silent
printf "x is %d\n",x
cont
end
如果在命令列表中指定的第一個命令是silent
,大約在斷點處停止平常郵件不打印。這對於打印特定消息然後繼續的斷點可能是理想的。如果其餘命令都沒有打印任何內容,則不會看到已達到斷點的跡象。只有在斷點命令列表的開始處,沉默纔有意義。對於斷點命令
一個應用是彌補一個錯誤,所以你可以測試其他。在錯誤的代碼行之後放置一個斷點,給它一個條件來檢測錯誤已經完成的情況,並且給它命令以將正確的值分配給任何需要它們的變量。以continue命令結束,以便程序不會停止,並從silent命令開始,以便不產生輸出。這裏有一個例子:
break 403
commands
silent
set x = y + 4
cont
end
澄清弗雷德裏克的回答,commands
(或只是command
,似乎)自動知道您只需設置一個斷點。也就是說,什麼是弗雷德裏克顯示不是多線break
命令,這是兩個獨立的命令:break
和commands
。它看起來像這樣:
(gdb) break 989
Breakpoint 23 at 0x7fffe2761dac: file foo.cpp, line 989.
(gdb) command
Type commands for breakpoint(s) 23, one per line.
End with a line saying just "end".
>silent
>print result
>end
(gdb) c
Continuing.
$79 = {elems = {0, 0}}
(gdb)
+1澄清Fredrik的答案。 – esmit
dprintf
(動態printf
)
https://sourceware.org/gdb/onlinedocs/gdb/Dynamic-Printf.html
這對於承印物的特定情況下,最方便的解決方案:
dprintf <line>, "%u\n", variable
它因爲它也可以比commands
更快可以編譯和注入代碼,而不是將控制權交給GDB來解釋任意命令字符串。 TODO我不知道這是否實際完成。dprintf
VS commands
:What is the difference between dprintf vs break + commands + continue?
詳細示例:
main.c
:
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
uint32_t i;
uint32_t r = 0;
for (i = 0; i < 10; ++i) {
r += i*i + 13*r*i + 17; /* LINE 10. */
}
printf("%" PRIu32 "\n", r);
return EXIT_SUCCESS;
}
然後:
gcc -ggdb3 -O0 -std=c99 -o main main.c
gdb -batch -nh -q -ex 'dprintf 10, "%u %u\n", i, r' -ex 'run' ./main
輸出:
Dprintf 1 at 0x400545: file main.c, line 10.
0 0
1 17
2 256
3 6933
4 277346
5 14699371
6 970158528
7 3628079733
8 3070853710
9 317092431
3057168588
[Inferior 1 (process 14305) exited normally]
在Ubuntu 14.04中測試過。
謝謝Fredrik。但是這裏的變量名稱是未知的權利。假設我有1GB的代碼。那麼我們應該怎麼做?有沒有通用的方法來做到這一點? – Thangaraj
@Thangaraj如果你有一個memleak,看看'valgrind'可能是找到memoryleaks和使用非常簡單的最佳工具! –
謝謝你。 valgrind將幫助我處理內存泄漏。但一般來說還有其他方法可以實現。只是爲了探索... – Thangaraj