linux下如何使用gdb除錯

2021-09-01 14:56:37 字數 4616 閱讀 1502

gdb是linux下非常好用的乙個除錯工具,雖然它是命令列模式的除錯工具,但是它的功能強大到你無法想象,這裡簡單介紹下gdb下常用的命令。

首先編譯生成可執行檔案(這裡的test.c是乙個簡單的求前n項和的程式)。

gcc -g test.c -o test(-g選項告訴gcc在編譯程式時加入除錯資訊)。

接下來可以這樣。

gdb test

然後你就會看到出現好多資訊在螢幕上,大致說的是gdb的一些版本資訊說明之類的,但是它對你除錯程式沒用呀,所以,你可以加上-q選項,不輸出它們。

gdb -q test

[lrt@localhost 1118]$ gdb -q test

reading symbols from test...done.

(gdb)

有沒有覺得這個世界一下子清淨了許多。

也可以先進入gdb模式,然後再載入檔案。

(gdb) file test

reading symbols from test...done.

(gdb)

好了,現在開始除錯了,但是我還想看看我的**怎麼辦,gdb提供了一條命令,可以讓你的程式顯示出來。

(gdb)                   //list預設一次顯示10行

1 #include2 int func(int n)

3 {

4 int i;

5 int sum=0;

6 for(i=0;ilist預設引數可以用show listsize來檢視,如果感覺10行太多或者太少,還可以用set listsize 來更改。

list 還可以加上其他引數,比如:

list 5,10 顯示第5行到第10行的**;

list func 顯示func函式周圍的**,顯示範圍和list引數有關;

list test.c:5,10 顯示原始檔test.c第5行到第10行的**,一般用於除錯含多個原始檔的程式。

gdb 還支援字串查詢,search str,從當前行開始,向前查詢含str的字串;

reverse-search str,從當前行開始,向後查詢含str的字串。

現在你的螢幕應該被佔滿了吧?想清空螢幕,可是還在gdb裡面呀,怎麼辦?其實,gdb也支援執行linux命令的,可以在gdb的提示符中,輸入shell,然後在輸入你需要的命令就可以了

(gdb) shell clear

這樣也能達到清屏的效果。

看了程式的**,感覺第6行**可能有點問題,現在就需要我就需要設定乙個斷點,讓程式停在第6行之前。

(gdb) break 6

breakpoint 1 at 0x80484c8: file test.c, line 6.

(gdb)

下面一行的 資訊,1說明我設定的這個斷點是第乙個斷點,斷點所在記憶體位址為0x80484c8,它在檔案test.c的第6行。

gdb還可以以條件表示式設定斷點。

(gdb) break 7 if n==6

breakpoint 2 at 0x80484d1: file test.c, line 7.

(gdb)

這個斷點的含義是,如果n的值為6,則程式執行到第7行停止。

當然,還可以直接在某個函式處設定斷點;直接break 函式名就可以了,

然後我們想看下設定的斷點資訊,可以使用info breakpoints命令。

(gdb) info breakpoints

num type disp enb address what

1 breakpoint keep y 0x080484c8 in func at test.c:6

2 breakpoint keep y 0x080484d1 in func at test.c:7

stop only if n==6

4 breakpoint keep y 0x080484c1 in func at test.c:5

(gdb)

num表示斷點的編號;type表示斷點的斷點的型別,第二個斷點型別還加上了條件;disp表示中斷點在執行一次之後是否失去作用,dis為是,keep為不是;enb表示當前中斷點是否有效,y為是,n為否;address表示中斷點所處的記憶體位址;what指出斷點所處的位置。

如果不需要程式在該斷點暫停時,有兩種方法,一種是使該斷點失效,一種是直接刪除該斷點。

(gdb) disable 1

(gdb) info breakpoints

num type disp enb address what

1 breakpoint keep n 0x080484c8 in func at test.c:6

2 breakpoint keep y 0x080484d1 in func at test.c:7

stop only if n==6

3 breakpoint keep y 0x080484c1 in func at test.c:5

(gdb)

可以看到,第乙個斷點的enb變為n了,表示該斷點已經無效了,如果需要恢復,可以使用enable命令。這裡需要注意的是,disable後面的引數為斷點的編號。而不是行號。

直接刪除該斷點,可以使用clear命令和delete命令。

(gdb) clear 6

已刪除的斷點 1

(gdb)

clear命令後面的引數為設定斷點的行號,clear後面引數還可以加設定斷點的函式名。

delete命令後面的引數為斷點的編號;可以一次刪除多個斷點,斷點編號之間用空格隔開;如果delete後沒有引數,預設刪除所以斷點,會給出提示選擇是否操作。

(gdb) delete

刪除所有斷點嗎? (y or n)

斷點設定好了,現在就可以除錯了,

(gdb) run                                  //開始執行程式

starting program: /home/wang/test

請輸入n的值10

breakpoint 1, func (n=10) at test.c:6 //設定的第乙個斷點,程式在第6行暫停

6 for(i=0;i上面出現了很多命令,下面就來說說都是怎麼用的。

run,開始執行程式;

continue,程式暫停時繼續執行程式的命令;

print 變數名或表示式,列印該變數或者該表示式的值。whatis 變數名或者表示式,可以顯示該變數或表示式的資料型別。

print 變數=值,這種形式還可以給對應的變數賦值;類似的還有set variable 變數=值。作用和用print賦值相同。

next,繼續執行下一條語句;還有一條命令step,與之類似,不同的是,當下一條語句遇到函式呼叫的時候,next不會跟蹤進入函式,而是繼續執行下面的語句,而step命令則會跟蹤進入函式內部。

(gdb) run

starting program: /home/wang/test

breakpoint 1, main () at test.c:16

16 scanf("%d",&n);

(gdb) next

請輸入n的值10

17 printf("1+2+..+%d=%d",n,func(n));

(gdb) next //next命令直接執行下一行,沒有進入func函式

18 return 0;

(gdb)

(gdb) run

starting program: /home/wang/test

breakpoint 1, main () at test.c:16

16 scanf("%d",&n);

(gdb) n

請輸入n的值10

17 printf("1+2+..+%d=%d",n,func(n));

(gdb) step                  //step命令跟蹤進入了func函式  

func (n=10) at test.c:5

5 int sum=0;

(gdb)

還有nexti和stepi命令,這兩個是單步執行一條機器指令,比如(i=0;iquit,退出gdb除錯,如果除錯中想要退出,可以直接輸入該命令,會出現提示選擇是否退出。kill命令,結束當前程式的除錯,(不會退出gdb)。

(gdb) quit

a debugging session is active.

inferior 1 [process 32229] will be killed.

quit anyway? (y or n)

linux下gdb的除錯使用

1.gdb除錯的物件是可執行檔案,而不是程式的源 因此在使用gcc編譯器時 需加 g選項。告訴gcc編譯器加入除錯資訊。例如 gcc g test.c o test 2.除錯gdb的格式是 例如 gdb test 3.在啟動gdb後,會顯示一段版權說明,如果要不顯示 加入 q即可 例如 gdb q ...

linux下使用GDB除錯程式

現有一c原始檔 gdb 01.c 下面用gdb除錯該程式。gdb 01.c include static int sum int value int main int argc,char argv int input argv 1 0 int result sum input printf 你輸入的...

Linux下使用gdb除錯跟蹤程序

可以使用gdb strace命令 推薦gdb 本文主要介紹使用gdb在linux下直接對程序進行跟蹤除錯 若想使用gdb對程序除錯,需要在編譯程式時加入相關的選項 set cmake build type debug set cmake cxx flags debug env o0 wall g2 ...