12

我正在尝试使用 eclipse cdt (Juno) 调试一些 fork() 机制。我用 C 编写了程序。

  if( -1 == (pid = fork()) ) /* error */
    goto cleanup;
  else if ( 0 == pid ) /* child */
  {
    execlp("gcc", "gcc", cFilePath, "-o" , GCC_OUTPUT_FILE_NAME, NULL);
    goto cleanup; /* Arrives here only on error! */
  }
  else if (pid > 0) /* parent - checks: correct pid returns, returns normally, with exit status = 0*/
  {
      returnedpid = wait(exitStatus);
      if( pid != returnedpid || exitStatus == NULL || !WIFEXITED(*exitStatus) || !WEXITSTATUS(*exitStatus) )
          goto cleanup;
  }

我尝试添加“ set follow-fork-mode child”,如此处所述:http: //unix.derkeiler.com/Newsgroups/comp.unix.programmer/2006-02/msg00435.html

1.如何调试代码段在哪里(0==pid)

2.当我到达wait语句时,调试器立即返回,不是wait()假设暂停直到孩子返回吗?为什么会立即返回?

4

3 回答 3

14

您的问题可能是由于“分叉分离”被设置为关闭。DSF 默认设置这个(这也是 gdb 的默认设置)。

1) 在带有“execlp...”和“returnedpid =...”的行上放置一个断点。2) 在调试配置中启用“不间断模式”和“自动调试分叉进程”。3) 开始调试会话。您将在子级或父级中遇到断点。现在查看调试视图。

调试视图

您会注意到您的二进制文件显示了两个线程。

4) 单击一个或另一个(上图中带有 main() 的行)以切换调试上下文。

于 2013-03-18T13:17:28.600 回答
1

这可能是因为 init 进程在您等待之前收割了孩子。在你进入 fork 时尝试阻塞 sigchld,然后在你的 fork/execs 之后解除阻塞信号。也许这应该让你对到底发生了什么有所了解。

使用 sigprocmask 应该会对您有所帮助。

于 2013-03-18T02:37:30.760 回答
1
  1. 在调试配置窗口 -> 调试器 -> 选中“自动调试分叉进程”
  2. 打开断点窗口 -> 查看菜单 -> 添加事件断点 C/C++ -> “fork called”
  3. 现在一旦发生事件断点,按 F6 -> 您将在调试窗口中看到新进程
  4. 选择新进程并按 F6 - 您在子进程中
  5. 享受
于 2014-05-21T16:29:00.577 回答