2011-06-29 16 views
38

一定的斷點我正在尋找一種方式做一些動作時,一個特定的斷點在gdb命中。做具體行動時,在gdb

基本上我有我的一些程序memleak。當malloc和free函數命中時,我需要進入函數(step)並且收集一些基本信息,比如addr和size(基本上打印那裏的值)。一旦完成恢復我的程序。

我們有什麼好的辦法做到這一點?

回答

45

例如,這裏是你如何使用斷點命令在進入打印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 
+0

謝謝Fredrik。但是這裏的變量名稱是未知的權利。假設我有1GB的代碼。那麼我們應該怎麼做?有沒有通用的方法來做到這一點? – Thangaraj

+0

@Thangaraj如果你有一個memleak,看看'valgrind'可能是找到memoryleaks和使用非常簡單的最佳工具! –

+0

謝謝你。 valgrind將幫助我處理內存泄漏。但一般來說還有其他方法可以實現。只是爲了探索... – Thangaraj

37

澄清弗雷德裏克的回答,commands(或只是command,似乎)自動知道您只需設置一個斷點。也就是說,什麼是弗雷德裏克顯示不是多線break命令,這是兩個獨立的命令:breakcommands。它看起來像這樣:

(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) 
+7

+1澄清Fredrik的答案。 – esmit

2

dprintf(動態printf

https://sourceware.org/gdb/onlinedocs/gdb/Dynamic-Printf.html

這對於承印物的特定情況下,最方便的解決方案:

dprintf <line>, "%u\n", variable 

它因爲它也可以比commands更快可以編譯和注入代碼,而不是將控制權交給GDB來解釋任意命令字符串。 TODO我不知道這是否實際完成。dprintf VS commandsWhat 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中測試過。