2012-05-02 5 views
3

Linux上のアプリケーションで問題をデバッグしようとしています。ランダムな場所でSIGSEGVがlibstdc++.soまたはlibstdc.soにクラッシュする傾向があります。Linuxでのスレッド問題のトラブルシューティング方法

私が追加したスレッドのジョブは非常に分離されているので、どこにでも明らかな競合状態はないようです。しかし、それはほとんどすべての時間クラッシュします。

アプリケーションはg++ -c ... -pthread -D_REENTRANTでコンパイルされ、g++ -pthread -o ...

にリンクされたが、それはまだlibstdc*.so機能の一つで、ほぼすべての時間をクラッシュますされています。私は何が間違っているのか理解しようと数日を無駄にしました...

誰にもヒントはありますか? libstdc*.soがスレッド認識としてコンパイルされていることを確認する方法はありますか?私を助けることができるどんなgdbコマンド?デバッグヒープ?

あなたがすべきいくつかのことがありますが、私はほんの数年前からLinuxに働いているので、私は迷ってしまいました...

+0

コードの関連セクションを投稿できますか? – hmjd

+0

あなたはそのワームの缶でいくつかのマスタードが欲しいですか? – PlasmaHH

+0

@hmjd:残念ながら、これは既に大きなコードベースであり、マルチスレッド化のために拡張されています。私は、そのサブセットの再生シナリオを作成することはできません。したがって、私は助けることができるテクニックを探しています、それは私ができることすべてです。 – Coder

答えて

4

を使用してアプリケーションを実行するを使用してアプリケーションを実行します

ユニットテストを書く。スレッドに関する問題を見つけるのにはあまり役立ちませんが、間違ったメモリアクセスの問題を発見することで大きな助けになります。

4

まだコンパイルしていない場合は、コンパイル時に-gを使用して、シンボリックデバッガーの情報を取得してください。

コアをダンプしますか?

gdb <my-exe> <my-core-file> 

を一度ロードされた(あなたが-gしてコンパイル仮定)を使用すると、すべてのスレッドスタックのリストを取得し、見てとることinfo threadsを使用することができます。その場合は次のように実行ファイルに対してコアをロードするためにgdbを使用することができます問題を引き起こしたスレッドsegフォールトの原因となったスタックトレースを、libstdc++.soまたはlibstdc.soから追跡すると、何が起きているのかは分かりません。少なくともそれはあなたを正しい場所に連れて行きます。

コアを取得していない場合は、デバッガ自体でアプリを実行できますか?単純に使用してプロセスにアタッチ:

gdb <my-exe> <my-process-id> 

、お互いをロックされている2つのスレッドを探し

また、この技術は、スレッドのデッドロックの底になってFO非常に便利です。

+0

私は 'gdb myapp'、' r'、 'SIGSEGV'、' bt'、 'info threads'でアプリを起動しています。私は呼び出しスタックを持っていますが、 'libstdc * .so's内の' malloc'と 'new'には失敗します – Coder

+0

あなたのランタイムライブラリのインストールのように聞こえなくなったり、ビルド環境とランタイム環境の間に互換性がありません。すべてを一から再構築し、 'LD_LIBRARY_PATH'または同等のものをチェックしましたか? –

+0

しかし、どのような関数が 'malloc'と' new'sを呼んでいますか?あなたのソフトウェアスタックに関連する関数が見つかるまで、呼び出しスタックを調べ、clibだけではありません。 – snies

関連する問題