1

C++ コードに非常に奇妙なバグがあります。

全体を理解するために話をしなければなりません。boost_thread ライブラリ経由でスレッドを使用しています。メイン メソッドはいくつかの初期化を行い、3 ~ 4 スレッドを開始してから、永久に待機します。

while(true) sleep(1);

すべてのスレッドのメイン関数には、いくつかの catch と catch all ハンドラーを使用した try があります。

void do_work() {
  try {
    ..
  }
  catch (int ei) {
  }
  catch (...) {
    log("General error");
  }
}

スレッドは次のようなさまざまなタスクを実行します

  • execv 関数でスクリプトを実行し、
  • sqlite ライブラリを使用してデータベースに書き込み、
  • openssl ライブラリを介して世界と通信します。

通常ではありませんが、非常に頻繁に、プログラムが終了してしまうことがあります。

すべてが適切に解放され、必要なときに削除されるため、これが問題になることはありません。問題をデバッグする機会を得るために、コア ダンプを生成するようにしました。

ここで興味深いのは、GDB のバックトレースが次のようになっていることです。

(gdb) bt
#0  0x40281ae8 in raise () from /lib/libc.so.6
#1  0x402830ec in abort () from /lib/libc.so.6
#2  0x402830ec in abort () from /lib/libc.so.6
#3  0x402830ec in abort () from /lib/libc.so.6
#4  0x402830ec in abort () from /lib/libc.so.6
#5  0x402830ec in abort () from /lib/libc.so.6
#6  0x402830ec in abort () from /lib/libc.so.6
#7  0x402830ec in abort () from /lib/libc.so.6
#8  0x402830ec in abort () from /lib/libc.so.6
#9  0x402830ec in abort () from /lib/libc.so.6

エンドレスのアボート コール。原因がわかりません。スレッドは次のようになります。

(gdb) info threads
  4 Thread 490  0x402e7bf4 in nanosleep () from /lib/libc.so.6
  3 Thread 489  0x4031b384 in accept () from /lib/libc.so.6
  2 Thread 501  0x402e7bf4 in nanosleep () from /lib/libc.so.6
* 1 Thread 486  0x40281ae8 in raise () from /lib/libc.so.6

スレッド 1 が無限のスリープ ループを持つメイン関数であるため、これも興味深いものです。

私の質問: どうすれば中絶の理由を知ることができますか?

フォーラム、IRC チャンネル、Google で検索していますが、それでも何もありません。私はこの数週間前に立ち往生したので、どんな情報でも大歓迎です!

どうもありがとうございました!

4

1 に答える 1

1

SIGABRT は通常、物事がひどく、ひどくうまくいかないときに送信されます。スタックが破棄される可能性があるため、追跡するのが難しい場合があります。

トレースバックから、削除された (そしておそらく最適化された) 実行可能ファイルで実行しているように見えます。-gコアダンプを取得したときに、もう少し洞察を得ることができるように、コンパイルとリンクを試みましたか?

于 2012-06-09T22:34:13.393 に答える