gdb除錯多程式
當然,你可以使用時間延遲的方法,在子程式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";
int
main(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) {
err_sys("fork error");
} else if (pid == 0) {/* child */
glob++;/* modify variables */
var++;
} else {
sleep(2);/* parent */
}
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
exit(0);
}
相關文章
- GDB多程式除錯除錯
- 使用 GDB 除錯多程式程式除錯
- gdb除錯多程序除錯
- GDB 除錯程式碼除錯
- 用GDB除錯程式除錯
- 用GDB除錯程式(六)除錯
- GDB多執行緒除錯分析執行緒除錯
- gdb多執行緒多程序除錯命令執行緒除錯
- gdb除錯除錯
- gdb除錯命令小結_與多檔案除錯_遠端除錯除錯
- GDB程式碼除錯與使用除錯
- 用GDB除錯程式(二) (轉)除錯
- 用GDB除錯程式(四) (轉)除錯
- 用GDB除錯程式(三) (轉)除錯
- GDB除錯MySQL除錯MySql
- gdb除錯命令除錯
- GDB除錯指令除錯
- Linux中使用GDB除錯程式Linux除錯
- gdb除錯正在執行的程式除錯
- GDB除錯彙總除錯
- gdb除錯快速上手除錯
- gdb除錯總結除錯
- linux下用gdb除錯c程式Linux除錯C程式
- 使用GDB命令列偵錯程式除錯C/C++程式命令列除錯C++
- 在MacOS上使用gdb(cgdb)除錯Golang程式Mac除錯Golang
- Linux GDB 程式除錯工具使用詳解Linux除錯
- 介紹 GDB 除錯 Go除錯Go
- GDB除錯命令詳解除錯
- C語言——gdb除錯C語言除錯
- GDB除錯使用記錄除錯
- Codeblocks和gdb除錯BloC除錯
- linux 下GDB除錯Linux除錯
- gdb高階除錯方法高階除錯
- 使用 gdb 工具除錯 Go除錯Go
- gdb高階除錯命令高階除錯
- gdb除錯coredump檔案除錯
- 使用GDB除錯Android Native 層程式碼除錯Android
- c/c++ gdb 除錯帶引數的程式C++除錯