當你在程序中使用fork(),如果用gdb來調試.不管是你在子進程是否設置斷點.你都只能在父進程單步調試,而沒辦法進入到子進程當中進行單步調試.因為gdb的所有處理(查看堆棧,內存,變量值)都是針對當前進程空間.
那麼是否就沒辦法調試多進程程序的子進程代碼呢?辦法還是有的,一般的標准方法是再打開一個gdb用attach功能來調試子進程.gdb attach 功能是不執行被調試程序,而是把gdb“掛”到一個已經運行的進程之上來進行調試,這掛載的動作稱為attach.當然也包括掛載子進程。
首先我們看一個如下簡單的多進程程序。
/*
Author: Andrew Huang [email protected]
debug multi-process by gdb.
*/
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define PRINT_INT(e) printf("%s=%d\n",#e,e)
int main()
{
pid_t pid;
int i,val = 100;
printf("process id %d\n",getpid());
pid = fork();
PRINT_INT(val);
if(pid == 0)
{/* child process */
val+=100;
printf("child process id %d,parent id %d\n",getpid(),getppid());
PRINT_INT(val);
i = 0;
while(1)
{
printf("child [%d]\n",i++);
sleep(1);
}
}
else if(pid >0)
{/* parent child */
printf("parent process id %d\n",getpid());
for(i=0 ; i < 5 ; i++)
{
printf("parent [%d]\n",i);
}
val+=10;
PRINT_INT(val);
wait(NULL);
}
else /* error */
{
exit(-1);
}
PRINT_INT(val);
return 0;
}
這個程序很簡單,就是子進程在無限循環打印屏幕,而父進程在用wait等待.
編譯 gcc test_fork.c -o test_fork -g