【问题标题】:Debug fork() in eclipse cdt在 eclipse cdt 中调试 fork()
【发布时间】:2013-03-17 22:43:41
【问题描述】:

我正在尝试使用 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() 假设暂停直到孩子返回吗?为什么会立即返回?

【问题讨论】:

    标签: c eclipse gdb fork eclipse-cdt


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 嗨 dbrank0。我按照你的例子,发现它工作(但你需要强制“自动调试分叉进程”选项)但无论如何都有问题。我正在“守护”我的过程,因此,按照大师的指示,我分叉了两次。在我看来,第一次分叉得到了正确的遵循,但是一旦我第二次尝试分叉,整个调试器就会挂起,我无法遵循这两个进程中的任何一个。无论如何,谢谢,但是......有什么想法吗?
    • 不,抱歉,但请查看“调试分叉”一章 (sourceware.org/gdb/onlinedocs/gdb/Forks.html) 中解释的任何开关是否有帮助。
    • 完美运行,甚至在 fork 之后遵循 execvp(swapn 新进程)。不错。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      1. 在调试配置窗口 -> 调试器 -> 勾选“自动调试分叉进程”
      2. 打开断点窗口 -> 查看菜单 -> 添加事件断点 C/C++ -> "fork 叫”
      3. 现在一旦发生事件断点,按 F6 -> 您将在调试窗口中看到新进程
      4. 选择新进程并按 F6 - 你在孩子里面
      5. 享受

      【讨论】:

      • 谢谢!请注意,用户界面有点糟糕,因此您可能看不到复选框。只需单击文本即可启用调试分叉进程。
      猜你喜欢
      • 2011-04-26
      • 2013-10-19
      • 2012-11-16
      • 2011-04-25
      • 2013-12-23
      • 2011-08-11
      • 1970-01-01
      • 2011-06-21
      • 2013-11-20
      相关资源
      最近更新 更多