GDB高階技巧

2021-05-26 01:33:44 字數 1499 閱讀 9810

本文主要示例一些平常較少使用到的gdb功能,掌握這些用法有助於提高gdb除錯和解決問題的能力。 

1) 檢視巨集 

預設情況下,在gdb中是不能檢視巨集的值及定義的,但通過如下方法,則可以達到目的: 

編譯源**時,加上「-g3 -gdwarf-2」選項,請注意不是「-g」,必須為「-g3」,檢視巨集的值使用命令p,這和檢視變數的值的方法相同,如果想檢視巨集的定義,使用 「-macro expand」命令即可 

2) 如果執行一連串命令? 

這個借助命令「source」即可,「source」的引數為乙個存有一串命令的檔名 

3) 如何同時給多個函式打斷點? 

使用「rb」命令,如果執行「rb」時不帶引數,則表示在所有函式處打乙個斷點,「rb」後面可以接乙個符合正規表示式的引數,用來對符合正規表示式的所有函式打斷點 

4) .gdbinit檔案 

gdb在啟動時,會在使用者主目錄中尋找這個檔案,並執行該檔案中所有命令,檔案格式為: 

define command-alias 

command 

end 

如要給「b main」取乙個別名「bm」: 

define bm 

b main 

end 

此外,還可以給這個別名加上幫助說明性文字,格式為: 

document bm 

幫助說明性文字 

end 

如,給「bm」別名新增幫助說明性文字: 

document bm 

break at main() function 

end 

這樣,在使用「help bm」時,gdb就會列印出「break at main() function」 

5) 自定義命令 

除了在.gdbinit檔案自定義命令外,還可以直接在gdb執行環境定義命令,語法相同 

6) 定義命令鉤子 

鉤子用來在執行某個命令前或命令後,先執行某個或某些命令。假如想在print命令前顯示一段 「----------」,則: 

define hook-print 

echo ----------/n 

end 

注意「hook-」後接的必須是命令全稱,不能是縮寫。 

如果想在命令執行完,再執行某個或某些命令,則: 

#define hookpost-print 

echo ----------/n 

end 

7) gdb中迴圈 

gdb支援 if/else/while/loop_break/loop_continue,如: 

(gdb) set $x=1 

(gdb) while $x==1 

>p $x 

>set $x=0 

>p $x 

>end 

----------------- 

b$8 = 1 

----------------- 

b$9 = 0

GDB高階技巧

gdb高階技巧 yijian 2009 2 22 難得有雅興,邊動手邊記錄操作步驟,本文主要示例一些平常較少使用到的gdb功能,掌握這些用法有助於提高gdb除錯和解決問題的能力。1 檢視巨集 預設情況下,在gdb中是不能檢視巨集的值及定義的,但通過如下方法,則可以達到目的 編譯源 時,加上 g3 g...

gdb斷點高階技巧

條件斷點 設定乙個條件斷點,條件由cond指定 在gdb每次執行到此 斷點時,cond都被計算。當cond的值為非零時,程式在斷點處停止。用法 break break args if condition 例如 break main if argc 1 break 180 if string null...

GDB除錯技巧

在公司工作了一段時間,發現 b s結構的 除錯很麻煩,經常用的手段是通過 printf 打一串訊息來進行跟蹤,然後估計問題出在 通過逐步新增 printf 語句,獲得越來越多的資訊最終確定問題的根源。我感覺這樣比較麻煩,如果能把 gdb的單步除錯功能用上就好了。工作之餘,做了一定的嘗試,希望對跟我一...