2012-03-04 81 views
6

我有一個應用程序,它分派一個子進程。GDB回溯子進程

子進程做了一些工作,並在中間的某個地方給出了分段錯誤。我用GDB調試此,我用:

set follow-fork-mode child 

我還設置一個斷點孩子中的功能。但GDB不會在我的斷點處停下來。

另外,父進程處理seg-fault,所以我不得不按ctrl-c退出。然後,當我使用backtrace打印堆棧我的一切是

沒有堆棧

爲什麼斷點未設置,爲什麼我沒有拿到堆棧?

+0

是你所撰寫的孩子計劃? – sirgeorge 2012-03-04 05:00:50

+0

不,但我確實有我的來源。 – broun 2012-03-04 05:09:26

+0

你可以在調試模式下從源代碼構建它(孩子)嗎? – sirgeorge 2012-03-04 05:12:27

回答

7

爲什麼斷點未設置

斷點設定,但它沒有被擊中,因爲...

,爲什麼我沒有得到堆棧?

......你明顯在調試錯誤的過程。

隨着set follow-fork-mode child,GDB將跟隨第一你創建的孩子。也許你創造了不止一個?

調試此方法的一種方法是使用signalsigaction建立SIGSEGV處理程序。

在處理程序,做到這一點:

void handler(int signo) 
{ 
    int i = 1; 
    fprintf(stderr, "pid=%d, got signal=%d\n", getpid(), signo); 
    while (i) { } 
} 

一旦你看到的信息打印出來,在另一個窗口:

gdb /proc/<pid>/exe <pid> 
(gdb) where 
+0

謝謝先生。 – 2016-01-19 21:54:52