2017-06-20 25 views
0

Webデーモンとリクエストがあり、SIGSEGVで失敗することがあります。アプリケーションを殺す前に、gdbの印刷スタックトレースを作成する方法gdbを使用してSIGSEGVを使用しているときにstacktraceを取得できません

$ 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'を使ってウェブデーモンを再構築できますか?たぶんデーモンのどこかにスタックオーバーフローがあります。 – ks1322

答えて

2

あなたのGDBセッションでは、マルチスレッド・プロセスのすべてのスレッドを接続していない、と他のスレッド(あなたが添付していなかった1)がSIGSEGVに走った、全体のプロセスを終了したことを示します。

GDBの非常に古いバージョンを使用している可能性があります(まだthis bugのバグが2009年に修正されています)。

gdb -p NNNNを使用する場合は、正しいプロセスIDを指定してください。 pgrep daemon-nameまたはps aux | grep daemon-nameは、どのプロセスをアタッチするのがよいか分かります。

+0

プログラムをgdbの下で(起動していないから)正しく実行すると、スタックが正しく停止して表示されることがわかりました。まだそのような行動の原因となるものは得られません。 "あなたのGDBセッションはマルチスレッドプロセスのすべてのスレッドを接続していないことを示しています" - gdbはすべてのスレッドを探し始めました(私のプログラムは接続時にpthreadsしかforkしません)。どんなスレッドを添付しても。 – brachistochron

+0

@brachistochron「私は自信がありました...」あなたの信頼は間違っています:GDBはすべてのスレッドにプロセスID(別名メインスレッドのPID)を指定します。ただし、メインスレッド以外のスレッドIDを指定すると、スレッドは1つのみです。 –

-1

SIGSEGVを入手した後で、gdbシェルの右にbacktraceまたはbtと入力してください。 別のスレッドごとにスタックトレースを調べるには、info threadで開始し、必要なスレッドを選択します(例:thread 3)。btと入力すると、そのスレッドのスタックトレースが表示されます。

+0

問題はこの行です "プログラムはもう存在しません"。プロセスのスタックを調べるには、プロセスが生きているはずですが、それは死んでいます。 – brachistochron

+0

コアダンプを収集し、gdb –

+0

で解析することができます。私が知る限り、コアダンプを作るためにはまだプロセスが必要です。私はちょうどSIGSEGVを入手した後すぐに終了したプロセスを持っています。どうやってこのコアダンプを手に入れられますか? – brachistochron

関連する問題