2013-02-28 46 views
22

我正在開發一個應用程序,父應用程序讓一個孩子處理某些任務。我遇到了一個問題,我將gdb配置爲follow-fork-mode子級,但在fork之後,在達到斷點後,它會發送一個SIGTRAP,但子節點終止並將SIGCHLD發送給父節點。gdb調試fork後的子進程

我叉之前已配置signal(SIGTRAP, SIG_IGN)所以我的理解是,孩子要繼承和忽略SIGTRAP到達斷點,但沒有發生的時候。

如果我不正確,請幫助我理解這一點。

如何成功調試子進程?

+2

取下PID「到達斷點後* ... ...,它會發送一個SIGTRAP ... *」這是調試器被通知斷點的方式。 「* ...孩子以某種方式終止... *」正常或異常終止?您可以對父節點中的'wait [...]([...,]&status [,...])''返回的值使用'WIFEXITED(status)'來檢查。詳細信息請參閱man 3 wait。 – alk 2013-02-28 07:01:05

回答

59

子進程繼承父進程的信號處理程序,但不是掛起的信號。

分叉之後,嘗試在分叉後的子進程執行的代碼中安裝SIGTRAP的信號處理程序。如果您不處理SIGTRAP,則默認操作是終止子代。

如果您要調試子進程,則必須使用follow-fork-mode。 您必須設置使用

set follow-fork-mode child 

模式。然而,現在只有孩子可以調試,和父運行選中。

還有一種調試子進程的骯髒方法。

執行fork()後,將sleep()調用放入子代執行的代碼中,使用ps實用程序獲取子代的PID,然後附加PID。

attach <PID of child process> 

現在,您可以調試子進程,就像其他任何進程一樣。

調試後,您可以使用

detach