GDB除錯例子

2021-08-31 07:52:51 字數 3132 閱讀 5330

2010-06-15: 除錯乙個在正執行的c程式

工作中會遇到需要debug乙個執行中的c程序,debug步驟

1. ps -ef |grep ***  找到程序的pid

2. gdb -p ***  用gdb關聯 這個c程序

3. dir /**/**   關聯源程式的目錄位置

4. b ***.c:行號  或者 b 方法名  設定斷點

5. c  完成程式執行

6. info b 檢視斷點資訊

7. delete 斷點number 刪除斷點

8. step 進入函式內部

9. q 推出debug

1 #include

23 static char buff [256];

4 static char* string;

5 int main ()

6 上面這個程式非常簡單,其目的是接受使用者的輸入,然後將使用者的輸入列印出來。該程式使用了乙個未經過初始化的字串位址 string,因此,編譯並執行之後,將出現 segment fault 錯誤:

$ gcc -o bugging -g bugging.c

$ ./bugging

please input a string: asfd

segmentation fault (core dumped)

為了查詢該程式中出現的問題,我們利用 gdb,並按如下的步驟進行:

1.執行 gdb bugging 命令,裝入 bugging 可執行檔案;

2.執行裝入的 bugging 命令 run;

3.使用 where 命令檢視程式出錯的地方;

4.利用 list 命令檢視呼叫 gets 函式附近的**;

5.唯一能夠導致 gets 函式出錯的因素就是變數 string。用print命令檢視 string 的值;

6.在 gdb 中,我們可以直接修改變數的值,只要將 string 取乙個合法的指標值就可以了,為此,我們在第8行處設定斷點 break 8;

7.程式重新執行到第 8行處停止,這時,我們可以用 set variable 命令修改 string 的取值; 例如:set variable string = (char*)malloc(100)

8.然後繼續執行,將看到正確的程式執行結果。

例子二:

源程式:tst.c

1 #include

23 int func(int n)

4 {5         int sum=0,i;

6         for(i=0; i

編譯生成執行檔案:(linux下)

cc -g tst.c -o tst

使用gdb除錯:

breakpoint 1, main () at tst.c:17    <---------- 在斷點處停住。

17               long result = 0;

(gdb) n          <--------------------- 單條語句執行,next命令簡寫。

18               for(i=1; i<=100; i++)

(gdb) n

20                       result += i;

(gdb) n

18               for(i=1; i<=100; i++)

(gdb) n

20                       result += i;

(gdb) c          <--------------------- 繼續執行程式,continue命令簡寫。

continuing.

result[1-100] = 5050       <----------程式輸出。

breakpoint 2, func (n=250) at tst.c:5

5                int sum=0,i;

(gdb) n

6                for(i=1; i<=n; i++)

(gdb) p i        <--------------------- 列印變數i的值,print命令簡寫。

$1 = 134513808

(gdb) n

8                        sum+=i;

(gdb) n

6                for(i=1; i<=n; i++)

(gdb) p sum

$2 = 1

(gdb) n

8                        sum+=i;

(gdb) p i

$3 = 2

(gdb) n

6                for(i=1; i<=n; i++)

(gdb) p sum

$4 = 3

(gdb) bt        <--------------------- 檢視函式堆疊。

#0  func (n=250) at tst.c:5

#1  0x080484e4 in main () at tst.c:24

#2  0x400409ed in __libc_start_main () from /lib/libc.so.6

(gdb) finish    <--------------------- 退出函式。

run till exit from #0  func (n=250) at tst.c:5

0x080484e4 in main () at tst.c:24

24              printf("result[1-250] = %d \n", func(250) );

value returned is $6 = 31375

(gdb) c     <--------------------- 繼續執行。

continuing.

result[1-250] = 31375    <----------程式輸出。

program exited with code 027. <--------程式退出,除錯結束。

(gdb) q     <--------------------- 退出gdb。

參考:

linux c 小程式 gdb除錯命令 例子

1 除錯函式的一系列命令,源 如下main.c include int add range int low,int high int main void 結果為55 5015 與正確結果不同,除錯如下 1步驟 gcc g main.c o main linux下c原始檔編譯 含有源 可以除錯 gdb...

GDB使用例子

一般來說 gdb主要除錯的是 c c 的程式。要除錯 c c 的程式,首先在編譯時,我們必須要把除錯資訊加到可執行檔案中。使用編譯器 cc gcc g 的 g 引數可以做到這一點。如 gcc g hello.c o hello g g hello.cpp o hello 如果沒有 g,你將看不見程式...

gdb 除錯 vs除錯

一 先要生成二進位制檔案 g g 1.cpp o 1.out g引數不要省,不然 gdb l 引數用不了 二 引數 設定斷點 設定 函式斷點break func 在某行設定斷點break 7 檢視斷點資訊 info break 刪除斷點 d 刪除所有斷點 d 3 刪除第三個 執行 r 下一步 n 逐...