2013-03-17 136 views
12

我试图用eclipse cdt(Juno)调试一些fork()机制。 我在C.在eclipse中调试fork()cdt

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.当我到达等待语句时,调试器立即返回,是不是等待()假设暂停直到孩子返回?为什么它会立即返回?

回答

13

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

1)将断点放在“execlp ...”和“returnedpid = ...”的行上。 2)在调试配置中启用“不停机模式”和“自动调试分叉过程”。 3)开始调试会话。你会在孩子或父母中找到一个断点。现在看到调试视图。

Debug view

你会发现你的二进制文件显示两个线程。

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

+0

嗨dbrank0。我遵循你的例子,并找到它的工作(但你需要强制“自动调试分叉进程”选项),但无论如何有问题。我正在“守护”我的过程,所以按照大师的指示,我分了两次。在我看来,第一个分支是正确的,但一旦我尝试第二次分叉整个调试器挂起,我不能跟随这两个过程。无论如何感谢,但...任何想法? – 2015-05-15 10:03:32

+0

不,对不起,但看看“调试叉”一章(https://sourceware.org/gdb/onlinedocs/gdb/Forks.html)中解释的任何开关是否有帮助。 – dbrank0 2015-05-15 10:12:20

+0

完美工作,甚至在fork之后执行execvp(swapn new process)。尼斯。 – 2016-03-31 13:56:07

1

这可能是因为初始化进程在您等待之前收回孩子。尝试在进入fork时阻止sigchld,然后在您的fork/exec之后解除阻止信号。也许这应该给你一些关于到底发生了什么的想法。

使用sigprocmask应该可以帮到你。

1
  1. 在调试配置窗口 - >调试器 - >选中 “自动调试已派生进程”
  2. 打开断点窗口 - >查看菜单 - >添加事件断点C/C++ - >
  3. “之称叉 ”现在,一旦事件发生断点,按F6键 - >你会看到在调试窗口中的新工艺
  4. 选择新工艺,按F6 - 您在孩子
  5. 享受
+0

谢谢!请注意,UI有点不好,所以你可能看不到复选框。只需点击文本即可启用调试分叉进程。 – protoss1210 2015-11-10 18:52:01