当你在程序中使用fork(),如果用gdb来调试.不管是你在子进程是否设置断点.你都只能在父进程单步调试,而没办法进入到子进程当中进行单步调试.因为gdb的所有处理(查看堆栈,内存,变量值)都是针对当前进程空间.
那么是否就没办法调试多进程程序的子进程代码呢?办法还是有的,一般的标准方法是再打开一个gdb用attach功能来调试子进程.gdb attach 功能是不执行被调试程序,而是把gdb“挂”到一个已经运行的进程之上来进行调试,这挂载的动作称为attach.当然也包括挂载子进程。
首先我们看一个如下简单的多进程程序。
/*
Author: Andrew Huang bluedrum@163.com
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