2013-03-17 110 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

相關問題