本文主要介紹一些簡單的、常用的gdb除錯技巧。
環境:gnu gdb (gdb) red hat enterprise linux (7.2-60.el6_4.1)
1 #include 2view code3int test_func2(void) 4
1011
void test_func1(int
flag)12;
14int b = 12;15
int i = 0;16
17if (flag == 0
) 20
21for (i = 0; i < sizeof(a)/sizeof(int); i++)
2425
for (i = 0; i < sizeof(a)/sizeof(int); i++)
2829 printf("\n"
);30
31test_func2();
3233}34
3536
37int main(void)38
下面除錯過程中的**就是以上**。
編譯:gcc -g test_gdb.c (注:必須加上-g引數,表示在檔案中加入除錯資訊)
加入乙個斷點
(gdb) b test_func1
(gdb) break test_func2
注:兩種方式是等價的,一般簡寫為b
加入乙個斷點並設定進入條件
(gdb) b test_func1 if flag == 1
顯示斷點資訊
(gdb) info b
(gdb) info breakpoints
失能乙個斷點
(gdb) disable b 2
注:disable了的停止點,gdb不會刪除,需要時,enable即可。
使能乙個斷點
(gdb) enable b 2
刪除乙個斷點
執行程式
run或r
列出源**
list或l
單步除錯
next或n
單步跟蹤,進入函式
step或s
在指定行停住
(gdb) b 25
繼續執行
continue或c
檢視某一變數值
(gdb) print b
(gdb) print a[0]
檢視靜態陣列
(gdb) print /x a
注:/x表示以十六進製制顯示
檢視動態陣列
(gdb) print /x *a@4
檢視記憶體
(gdb) x/4xh a
語法格式:x/
n、f、u是可選的引數。
n是乙個正整數,表示顯示記憶體的長度,也就是說從當前位址向後顯示幾個位址的內容。
f 表示顯示的格式,參見上面。如果位址所指的是字串,那麼格式可以是s,如果位址是指令位址,那麼格式可以是i。
u 表示從當前位址往後請求的位元組數,u引數可以用下面的字元來代替,b表示單位元組,h表示雙位元組,w表示四位元組,g表示八字節。
gdb資料顯示格式:
x按十六進製制格式顯示變數
d按十進位制格式顯示變數
u按十六進製制格式顯示無符號整型
o按八進位制格式顯示變數
t按二進位制格式顯示變數
a按十六進製制格式顯示變數
c按字元格式顯示變數
f按浮點數格式顯示變數
檢視陣列compare_zero的記憶體的64個位址以十進位制顯示,每個位址請求單個位元組。
直接使用quit命令就可退出除錯。
GDB除錯技巧
在公司工作了一段時間,發現 b s結構的 除錯很麻煩,經常用的手段是通過 printf 打一串訊息來進行跟蹤,然後估計問題出在 通過逐步新增 printf 語句,獲得越來越多的資訊最終確定問題的根源。我感覺這樣比較麻煩,如果能把 gdb的單步除錯功能用上就好了。工作之餘,做了一定的嘗試,希望對跟我一...
GDB除錯技巧
談到gdb,不能不對他的強大功能所折服,在我所用過的所有偵錯程式中,這實在是乙個強大的除錯工具,今天就說說gdb的簡單用法。gdb是gnu開源組織發布的乙個強大的unix下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像vc bcb等ide的除錯,但如果你是在 unix平台下做軟體,你會發現...
gdb除錯技巧
1 以結構體形式訪問某個記憶體 print type addr 其中type是結構體型別,addr是記憶體的位址 2 顯示符號表 info symbol info symbol symbol addr symbol addr為對應的位址 print 符號名 3 檢視型別的原型定義 有時候在除錯大型程...