linux系統中包含了gnu 除錯程式gdb,它是乙個用來除錯c和 c++ 程式的偵錯程式。可以使程式開發者在程式執行時觀察程式的內部結構和記憶體的使用情況。
(1)監視程式中變數的值;
(2)設定斷點以使程式在制定的**上上執行;
(3)一行一行的執行**。
gdb程式除錯的物件是可執行檔案,,需在執行gcc指令編譯程式時,加上-g引數,指定程式在編譯時包含除錯資訊。除錯資訊包含程式裡的每個變數的型別和在可執行檔案裡的位址對映以及源**的行號。gdb 利用這些資訊使源**和機器碼相關聯。
啟動gdb後,可以在命令列制定很多選項,也可以用下面的方式在命令列中指定想要除錯的檔名:
$ gdb filename
此時,gdb會裝入名為filename的可執行檔案,用這種方式執行gdb可以直接指定想要除錯的程式。也可以用gdb去檢查乙個因程式異常終止而產生的core檔案,或者與乙個正在執行的程式相連。
下面舉個例項來介紹如何一步步的用gdb除錯程式,顯示乙個簡單的「hello world!」,再用凡需將此輸出。**如下:
1lxy1.c/*lxy1.c
*/2 #include3
void print1(char *string)4
7void print2(char *string)8
1920
main()
21
$gcc -o lxy1 lxy1.c
編譯成功後,執行lxy1:
./lxy1
程式顯示的結果如下:
the string is:hello world!
the string printed backward is:
可知第二行輸出時錯誤的 ,現在用gdb進行除錯,重新編譯如下:
$gcc -o lxy1 lxy1.c -g
現在可以用gdb對gdbtest進行除錯,輸入命令如下:
$gdb lxy1
這個命令將載入lxy1可執行檔案,進入gdb後,輸入run命令執行lxy1,結果如下:
staring program:/home/lxy/book/src/chapter2/lxy1
the string is:hello world!
the string printed backward is:
program exited normally
為了找出問題在哪,在gdb下輸入list命令可列出源**。由一系列分析知道在14行設定斷點,應該輸入下面的命令
(gdb)break 14
breakpoint 1 at 0x80484ee:file lxy1.c,line 14.
再輸入run,將產生如下的輸出:
(gdb)run
staring program:/home/lxy/book/src/chapter2/lxy1
the string is:hello world!
breakpoint 1 ,print2(string=0xbffff32d"hello world!") at lxy1.c:14
14 string2[size-i] = string[i];
由此可知道程式停在13行「string2[size-i]=string[i]」,可以通過設定乙個觀察點來觀察string2[size-i]變數的值,看錯誤咋產生的。如下:
(gdb)watch string2[size-i]
hardware watchpoint 2:string2[size-i]
輸入命令 c 使程式繼續執行,直到停止在下次迴圈體語句中,這裡可知string2[size-i]= string[i]應修正為string2[size-i-1]= string[i].
通過這個例子,知道了gdb程式的呼叫、在gdb中顯示原始檔、設定斷點、觀察變數、單步執行等。需要多加練習。。
GDB偵錯程式簡介
linux系統中包含了gnu 除錯程式gdb,它是乙個用來除錯c和 c 程式的偵錯程式。可以使程式開發者在程式執行時觀察程式的內部結構和記憶體的使用情況。1 監視程式中變數的值 2 設定斷點以使程式在制定的 上上執行 3 一行一行的執行 gdb程式除錯的物件是可執行檔案,需在執行gcc指令編譯程式時...
gdb偵錯程式簡介
偵錯程式 gdb 大而不全 三特點 啟動被除錯的程式 設定斷點,單步執行 檢視變數的值 gcc g 生成除錯資訊 gdb sum 生成可執行檔案 quit 退掉 1 檢視源 gdb 可執行檔案 tui layout asm 彙編 原始碼 layout split 彙編 layout src 原始碼 ...
GDB偵錯程式簡介
linux系統中包含了gnu 除錯程式gdb,它是乙個用來除錯c和 c 程式的偵錯程式。可以使程式開發者在程式執行時觀察程式的內部結構和記憶體的使用情況。1 監視程式中變數的值 2 設定斷點以使程式在制定的 上上執行 3 一行一行的執行 gdb程式除錯的物件是可執行檔案,需在執行gcc指令編譯程式時...