linux gdb除錯問題彙總

2021-09-26 08:47:53 字數 1302 閱讀 1895

1. 巨集除錯

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

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

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

info macro – 你可以檢視這個巨集在哪些檔案裡被引用了,以及巨集定義是什麼樣的。 macro – 你可以檢視巨集展開的樣子。 

2. 找不到原始檔

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

(gdb) list main

1192 ls.c: no such fileor directory.

inls.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;

3. 條件斷點

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

4.命令列引數 

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

1.gdb命令列的 –args 引數 gdb環境中 set args命令。2.gdb的變數 

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

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

(gdb) set$i = 0

(gdb) p a[$i++]

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

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

5. x命令

C 專案除錯 問題彙總

picturebox.image image.for 路徑 不要用picturebox.imagelocation picturebox.image image.for 路徑 設定放在totaldetection函式中 在異常設定中關閉 異常選項 中斷模式嘗試用如下方式解決 不管用 嘗試解決方法2 ...

Android系統除錯問題與技巧彙總

1 android的m mm mmm編譯命令的使用 m 編譯所有的模組 mm 編譯當前目錄下的模組,當前目錄下要有android.mk檔案 mmm 編譯指定路徑下的模組,指定路徑下要有android.mk檔案 需要在android原始碼根目錄執行 build envsetup.sh 指令碼設定環境 ...

linux gdb除錯彙編

1 除錯hello,要求編譯時指定了 gstabs選項 2 執行hello deepfuture lx deepfuture lx desktop private mytest hello hello,world abcd 3 用gdb開啟hello deepfuture lx deepfuture...