GDB除錯方法

2021-09-08 18:45:00 字數 1922 閱讀 3972

一、多執行緒除錯

多執行緒除錯可能是問得最多的。其實,重要就是下面幾個命令:

二、除錯巨集

這個問題超多。在gdb下,我們無法print巨集定義,因為巨集是預編譯的。但是我們還是有辦法來除錯巨集,這個需要gcc的配合。

在gcc編譯程式的時候,加上-ggdb3引數,這樣,你就可以除錯巨集了。

另外,你可以使用下述的gdb的巨集除錯命令 來檢視相關的巨集。

三、原始檔

編譯程式員是否加上了-g引數以包含debug資訊。

路徑是否設定正確了。使用gdb的directory命令來設定原始檔的目錄。

下面給乙個除錯/bin/ls的示例(ubuntu下)

$ apt-get source coreutils

$ sudo apt-get install coreutils-dbgsym

$ gdb /bin/ls

gnu gdb (gdb) 7.1-ubuntu

(gdb) list main

1192 ls.c: no such file or directory.

in ls.c

(gdb) directory ~/src/coreutils-7.4/src/

source directories searched: /home/hchen/src/coreutils-7.4:$cdir:$cwd

(gdb) list main

1192 }

1193 }

1194

1195 int

1196 main (int argc, char **ar**)

1197 {

1198 int i;

1199 struct pending *thispend;

1200 int n_files;

1201

四、條件斷點

條件斷點是語法是:break  [where] if [condition],這種斷點真是非常管用。尤其是在乙個迴圈或遞迴中,或是要監視某個變數。注意,這個設定是在gdb中的,只不過每經過那個斷點時gdb會幫你檢查一下條件是否滿足。

五、命令列引數

有時候,我們需要除錯的程式需要有命令列引數,很多朋友都不知道怎麼設定除錯的程式的命令列引數。其實,有兩種方法:

gdb命令列的 –args 引數

gdb環境中 set args命令。

六、gdb的變數

有時候,在除錯程式時,我們不單單只是檢視執行時的變數,我們還可以直接設定程式中的變數,以模擬一些很難在測試**現的情況,比較一些出錯,或是switch的分支語句。使用set命令可以修改程式中的變數。

另外,你知道gdb中也可以有變數嗎?就像shell一樣,gdb中的變數以$開頭,比如你想列印乙個陣列中的個個元素,你可以這樣:

(gdb) set $i = 0

(gdb) p a[$i++]

...  #然後就一路回車下去了

當然,這裡只是給乙個示例,表示程式的變數和gdb的變數是可以互動的。

七、x命令

八、command命令

(gdb) break func

breakpoint 1 at 0x3475678: file test.c, line 12.

(gdb) command 1

type commands for when breakpoint 1 is hit, one per line.

end with a line saying just "end".

>print arg1

>print arg2

>print arg3

>end

(gdb)

當我們的斷點到達時,自動執行command中的三個命令,把func的三個引數值打出來。

(全文完)

GDB除錯方法精粹

除錯命令 說明info threads 檢視當前程序的執行緒。gdb會為每個執行緒分配乙個id,後面操作執行緒的時候會用到這個id.前面有 的是當前除錯的執行緒.thread 切換除錯的執行緒為指定id的執行緒。break file.c 100 thread all 在file.c檔案第100行處為...

gdb常用的除錯方法

1.安裝gdb yum install gdb 2.列印執行緒的堆疊 1,ps afx 檢視程序id 2,attach 正在執行的程序 gdb debugme pid 3,set logging file tmp test.txt 設定操作gdb的日誌輸出檔案 set logging on 開啟日誌...

GDB多執行緒除錯方法

一 多執行緒除錯 多執行緒除錯重要就是下面幾個命令 info thread 檢視當前程序的執行緒。thread 切換除錯的執行緒為指定id的執行緒。break file.c 100 thread all 在file.c檔案第100行處為所有經過這裡的執行緒設定斷點。set scheduler loc...