GDB高階技巧

2021-09-21 09:02:08 字數 1433 閱讀 6821

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的單步除錯功能用上就好了。工作之餘,做了一定的嘗試,希望對跟我一...