调试子进程 - GDB / DDD

时间:2011-04-24 01:23:02

标签: debugging gdb child-process

我的项目是通过使用&结束arglist来实现一个带后台处理的简单shell程序,就像在大多数UNIX shell中一样。我的问题是当后台处理需要创建子进程时如何在GDB中调试shell。

我的孩子处理代码就像

int id;
int child=-1;
int running=0;

if ((strcmp(args[0], "&")==0){

  if ((id==fork())==-1)
    perror("Couldn't start the background process");

  else if (id==0){  //start the child process
    running++;
    printf("Job %d started, PID: %d\n", running, getpid());
    signal(SIGINT, SIG_DFL);
    signal(SIGQUIT, SIG_DFL);
    execvp(args[0], args);
    perror("Can't execute command);
    exit(1);

  else {
    int jobNum= running-(running-1);

   if ( (waitpid(-1, &child, WNOHANG) == -1)
     perror("Child Wait");

   else 
     printf("[%d] exited with status %d\n", jobNum, child>>8);
}

当我尝试运行命令(如ps&)并将断点设置为函数解析器时,该命令将执行而不会触及断点。这是令人困惑的,并且在这种情况下使调试器无用。我该怎么办呢?

1 个答案:

答案 0 :(得分:1)

我想你想要

set follow-fork-mode child

还要注意该行

if ((id==fork())==-1)

将未初始化的值与fork()的返回值进行比较。 我相信你想要一份任务。