如何使用gdb除錯多程序 attach方法

2021-06-16 07:12:18 字數 2546 閱讀 6664

[測試程式]

我們先看看我們的測試程式:

/* in eg1.c */

int wib(int no1, int no2)

int main()

else if (pid == 0)

printf("%d wibed by %d equals %d\n", value, div, total);

exit(0);

} else

}該測試程式中子程序執行過程中會在wib函式中出現乙個'除0'異常。現在我們就要除錯該子程序。

[除錯原理]

不知道大家發現沒有,在(!)處在我們的測試程式在父程序fork後,子程序呼叫sleep睡了60秒。這就是關鍵,這個sleep本來是不該存在於子程序**中的,而是而了使用gdb除錯後加入的,它是我們除錯的乙個關鍵點。為什麼要讓子程序剛剛執行就開始sleep呢?因為我們要在子程序睡眠期間,利用 shell命令獲取其process id,然後再利用gdb除錯外部程序的方法attach到該process id上,除錯該程序。

[除錯過程]

我覺上面的除錯原理的思路已經很清晰了,剩下的就是如何操作的問題了。我們來實踐一次吧!

我所使用的環境solaris os 9.0/gcc 3.2/gdb 6.1

gdb 除錯程式的前提條件就是你編譯程式時必須加入除錯符號資訊,即使用'-g'編譯選項。首先編譯我們的源程式'gcc -g -o eg1 eg1.c'。編譯好之後,我們就有了我們的除錯目標eg1。由於我們在除錯過程中需要多個工具配合,所以你最好多開啟幾個終端視窗,另外一點需要注意的是最好在eg1的working directory下執行gdb程式,否則gdb回提示'no symbol table is loaded'。你還得手工load symbol table。好了,下面我們就'按部就班'的開始除錯我們的eg1。

執行eg1:

eg1 &   --- 讓eg1後台執行吧。

查詢程序id:

ps -fu your_user_name

執行gdb:

gdb

(gdb)attach ***xx--- ***xx為利用ps命令獲得的子程序process id

(gdb)stop--- 這點很重要,你需要先暫停那個子程序,然後設定一些斷點和一些watch

(gdb)break 37-- 在result = wib(value, div);這行設定乙個斷點,可以使用list命令察看源**

breakpoint 1 at 0x10808: file eg1.c, line 37.

(gdb)

continue

continuing.

breakpoint 1, main () at eg1.c:37

37                              result = wib(value, div);

(gdb)step

wib (no1=10, no2=6) at eg1.c:13

13              diff = no1 - no2;

(gdb)continue

continuing.

breakpoint 1, main () at eg1.c:37

37                              result = wib(value, div);

(gdb)step

wib (no1=9, no2=7) at eg1.c:13

13              diff = no1 - no2;

(gdb)continue

continuing.

breakpoint 1, main () at eg1.c:37

37                              result = wib(value, div);

(gdb)step

wib (no1=8, no2=8) at eg1.c:13

13              diff = no1 - no2;

(gdb)next

14              result = no1 / diff;

(gdb)

print diff

$6 = 0        ------- 除數為0,我們找到罪魁禍首了。

(gdb)next

program received signal sigfpe, arithmetic exception.

0xff29d830 in .div () from /usr/lib/libc.so.1

至此,我們除錯完畢。

**:

gdb多程序除錯

使用gdb最好的文件就是其名為 debugging with gdb 的參考手冊。手冊中有一小章節提到了如何除錯多程序程式。一般情況下,如果被gdb除錯的程式中呼叫fork派生出乙個新的子程序,這時gdb除錯的仍然還是父程序,其子程序的執行不被理會。如果之前你在子程序的執行routine上設定了斷點...

gdb除錯多程序

在大多數系統,gdb對使用fork建立的程序沒有進行特別的支援。當父程序使用fork建立子程序,gdb仍然只會除錯父程序,而子程序沒有得到控制和除錯。這個時候,如果你在子程序執行到的 中設定了斷點,那麼當子程序執行到這個斷點的時候,會產生乙個sigtrap的訊號,如果沒有對此訊號進行捕捉處理,就會按...

gdb除錯多程序

gdb 是 linux 系統上常用的 c c 除錯工具,功能十分強大。對於較為複雜的系統,比如多程序系統,如何使用 gdb 除錯呢?實際上,gdb 沒有對多程序程式除錯提供直接支援。例如,使用gdb除錯某個程序,如果該程序fork了子程序,gdb會繼續除錯該程序,子程序會不受干擾地執行下去。如果你事...