gdb高階技巧
yijian 2009-2-22
難得有雅興,邊動手邊記錄操作步驟,本文主要示例一些平常較少使用到的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
end7) 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功能,掌握這些用法有助於提高gdb除錯和解決問題的能力。1 檢視巨集 預設情況下,在gdb中是不能檢視巨集的值及定義的,但通過如下方法,則可以達到目的 編譯源 時,加上 g3 gdwarf 2 選項,請注意不是 g 必須為 g3 檢視巨集的值使用命令p,這和檢視...
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的單步除錯功能用上就好了。工作之餘,做了一定的嘗試,希望對跟我一...