Linux 下用gdb单步调试多进程方法

当你在程序中使用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

相关推荐