2013-04-23 7 views
6

デーモンとして動作する高トラフィックネットワークCサーバアプリケーションを開発中です。状況によっては、アプリがクラッシュする(常にコアがない)。実行中のデーモンをgdbでデバッグして、SIGSEGVを生成する場所を見つける方法は?gdbを使って実行中のデーモンをデバッグ

注記:

  1. 私はプロセスにアタッチした後、コマンドに

  2. を添付して使用して実行中のプロセスにGDBを使用して接続する方法を知って、それが停止します。私が "continue"を実行すると、プログラムがクラッシュしない場合、gdbはブロックされたままです。私がCTRL-Cを押すと、プロセスは終了しており、単にgdbを切り離すことはできません。

そこで質問です:GDBがスタックしているが、プロセスがクラッシュしない場合は取り外しができず、プロセスを継続する方法はありますか?

+0

をあなたが変更しようとしたことがありコアダンプ設定'ulimit'コマンドですか?そして/またはデバッグバージョンを実行していますか?あるいは、クラッシュの可能性のある場所を絞り込むためにログを追加することもできますか? –

+0

私はすべての可能性を試しました。 このプロセスは、Ubuntuサーバー上でupstartサービスとして実行され、サービス開始時に特定のユーザーに設定されます。 limits.confには、そのユーザーのnofileとcoreの両方に無制限の値が含まれています。 私は/etc/sysctl.confにfs.suid_dumpableとkernel.core_uses_pidを設定しました ロギングを追加しましたが、トラフィックの多いサーバーであり、あまりにも多くの出力を生成します。 –

答えて

3

このページattach/detachは、detachコマンドがgdbの内部で機能すると言います。

アプリケーションでセグメンテーション違反をキャッチする場合は、デバッガからアプリケーションを実行する必要があります。信号が捕捉されたら、whereまたはbtを使ってアプリケーションのスタックトレースを見ることができます。もちろん、アプリケーションをフォルトした後もアプリケーションを続行できません。どのように復旧する必要がありますか?すぐに障害をトリガーする予定の場合は、実行中のプロセスにアタッチして、デバッガーのフォールトを再度待機させることができます。

フォールトが発生した後にスタックトレースが必要な場合は、アタッチするプロセスがないため、実際にはコアファイルが必要です。デーモンがシステムの一部として起動された場合、コアをダンプする設定を取得するのが難しいかもしれません。また、他のアプリケーションがコアダンプを残したくないかもしれません。だから、私はシステムデーモンを止め、あなたのユーザ空間でそれをやり直すというアドバイスをしてから、コアをダンプできるようにすることができます。システムの一部として起動することが本当に必要な場合は、デーモンの起動が単一のサブシェルに限定されているかどうかを確認し、そのサブシェルでulimit -cを使用して、コアの適切な最大サイズを設定しますダンプ。

+0

私は知っていますが、 "continue"コマンドを実行した後、gdbを終了する唯一の方法は、実行中のプロセスを停止するCTRL-Cを押すことです。 –

+0

'continue'の代わりに' detach'を使い、 'quit'を使います。私のために働く。 –

+0

私は理解していますが、プロセスがクラッシュした場合にバックトレースを取得できるようにしたいと考えています。 –

6

てみ非同期モードと "は&を続ける":次に非stop.gdb

set target-async on 
set pagination off 
set non-stop on 

以下の保存を実行します。

$ gdb -x non-top.gdb 
(gdb) !pgrep YOUR-DAEMON 
1234 
(gdb) attach 1234 
(gdb) continue -a & 
(gdb) 
+0

ありがとうございます。私はこれを試し、フィードバックを投稿します。 –

関連する問題