2017-06-20 41 views
0

我有web守護程序和使SIGSEGV失敗的請求。所以我開始守護程序,用gdb重視,持續,發送請求並得到這個:當SIGSEGV使用gdb時無法獲取堆棧跟蹤

$ gdb attach -p 630066 

(gdb) c 
Continuing. 

Program terminated with signal SIGSEGV, Segmentation fault. 
The program no longer exists. 
(gdb) 

如何使GDB打印堆棧跟蹤查殺應用程序之前?應用程序沒有子進程,只有線程。

謝謝。

+0

你能用'-fstack-protector-all'重建web守護進程嗎?守護進程中的某處可能存在堆棧溢出。 – ks1322

回答

2

你的GDB會話表明您還沒有連接的多線程進程的所有線程,並其他線程(一個你不重視)跑進SIGSEGV和終止的全過程。

另一種(不太可能)的可能性是,你使用的是一個非常舊的版本的GDB,其中仍然有this bug(該錯誤在2009年得到修復)。

使用gdb -p NNNN時,您需要小心並指定正確的進程ID。 pgrep daemon-nameps aux | grep daemon-name應該給你一個好主意附加哪個過程。

+0

我發現,如果在gdb下運行程序(從開始不附加),它會正確停止並顯示堆棧。仍然沒有得到這種行爲的原因。 「你的GDB會話表明你沒有附加多線程進程的所有線程」 - 我確信gdb在連接時開始尋找所有線程(我的程序只有pthreads而不是fork)。無論我附加的線程。 – brachistochron

+0

@brachistochron「我很有信心......」。你的信心是錯誤的:GDB將附加所有線程IFF你給它的進程ID(也稱爲主線程的PID),但只有一個線程,如果你給它的非主線程的線程ID。 –

-1

只需在獲取SIGSEGV後在gdb shell中輸入backtracebt即可。 要探索每個單獨線程的堆棧跟蹤,請從info thread開始,然後選擇所需的線程,例如thread 3,然後鍵入bt以查看該線程的堆棧跟蹤。

+0

問題是這行「程序不再存在」。爲了檢查堆棧過程,我應該有活着的過程,但它已經死了。 – brachistochron

+0

您可以收集核心轉儲並使用gdb對其進行分析 –

+0

據我所知,您仍然需要活躍的進程來製作coredump。我只是在獲得SIGSEGV後立即完成過程。我怎樣才能得到這個coredump? – brachistochron