gdb除錯多程序

2021-07-24 17:48:28 字數 1905 閱讀 7151

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

當然,你可以使用時間延遲的方法,在子程序fork出來之後,使用sleep函式等待一段時間再執行,在這段時間中你使用ps找到該程序,然後使用attach方法把該程序附加到gdb中,從而達到可以除錯子程序的目的。

在一部分系統中(我使用的是基於2.6核心的centos,支援follow-fork和detach-on-fork模式),比如hp-ux11.x之後的版本,linux2.5.60之後的版本,可以使用以下的方法來達到方便的進行多程序除錯功能。

預設情況下,父程序fork乙個子程序,gdb只會繼續除錯父程序而不會管子程序的執行。

如果你想跟蹤子程序進行除錯,可以使用set follow-fork-mode mode來設定fork跟隨模式。

set follow-fork-mode 所帶的mode引數可以是以下的一種:

parent

gdb只跟蹤父程序,不跟蹤子程序,這是預設的模式。

child

gdb在子程序產生以後只跟蹤子程序,放棄對父程序的跟蹤。

進入gdb以後,我們可以使用show follow-fork-mode來檢視目前的跟蹤模式。

可以看到目前使用的模式是parent。

然而,有的時候,我們想同時除錯父程序和子程序,以上的方法就不能滿足了。linux提供了set detach-on-fork mode命令來供我們使用。其使用的mode可以是以下的一種:

on只除錯父程序或子程序的其中乙個(根據follow-fork-mode來決定),這是預設的模式。

off父子程序都在gdb的控制之下,其中乙個程序正常除錯(根據follow-fork-mode來決定)

另乙個程序會被設定為暫停狀態。

同樣,show detach-on-fork顯示了目前是的detach-on-fork模式,如上圖。

以上是除錯fork產生子程序的情況,但是如果子程序使用exec系統函式而裝載了新程式執行呢?——我們使用set follow-exec-mode mode提供的模式來跟蹤這個exec裝載的程式。mode可以是以下的一種:

new 當發生exec的時候,如果這個選項是new,則新建乙個inferior給執行起來的子程序,而父程序的inferior仍然保留,當前保留的inferior的程式狀態是沒有執行。

same 當發生exec的時候,如果這個選項是same(預設值),因為父程序已經退出,所以自動在執行exec的inferior上控制子程序。

我們可以使用apue裡面第8章的例子**來做測試:

#include "apue.h"

intglob = 6;/* external variable in initialized data */

charbuf = "a write to stdout\n";

intmain(void)

intvar;/* automatic variable on the stack */

pid_tpid;

var = 88;

if (write(stdout_fileno, buf, sizeof(buf)-1) != sizeof(buf)-1)

err_sys("write error");

printf("before fork\n");/* we don't flush stdout */

if ((pid = fork()) < 0) else if (pid == 0) else   

gdb多程序除錯

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

gdb除錯多程序

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

GDB多程序除錯

使用 gdb 除錯的時候,gdb 預設只能跟蹤乙個程序,可以在 fork 函式呼叫之前,通過指令設定 gdb 除錯工具跟蹤父程序或者是跟蹤子程序,預設跟蹤父程序。設定除錯父程序或者子程序 set follow fork mode parent 預設 child 設定除錯模式 set detach o...