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 逐...