在 Eclipse cdt 中调试 fork()

问题描述 投票:0回答:4

我正在尝试使用 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() 不是应该挂起直到子进程返回吗?为什么立即返回?

c eclipse gdb fork eclipse-cdt
4个回答
14
投票

您的问题可能是由于“detach-on-fork”被设置为关闭所致。 DSF 默认设置它(这也是 gdb 的默认设置)。

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

Debug view

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

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


1
投票

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

使用 sigprocmask 应该对你有帮助。


1
投票
  1. 在调试配置窗口 -> 调试器 -> 选中“自动调试分叉进程”
  2. 打开断点窗口 -> 查看菜单 -> 添加事件断点 C/C++ -> "fork 称为“
  3. 现在,一旦事件断点发生,按 F6 -> 您将在调试窗口中看到新进程
  4. 选择新流程并按F6 - 你是孩子里面的人
  5. 享受

0
投票

为了添加@dbrank0 的完美答案,“调试配置”窗口位于“运行”菜单下。您可以在“调试器”选项卡下找到提到的配置。

© www.soinside.com 2019 - 2024. All rights reserved.