0

C++ やマルチスレッド コードの経験者がミューテックスの問題に光を当てることができれば幸いです。Red Hat Linux 5.4 で動作しています。私が書いていないレガシーコードをデバッグしています。1 秒あたりのコール数が非常に多いと想定されており、応答時間は 3 ~ 5 ミリ秒です。メイン アプリケーションで約 400 のスレッドを実行しています。

このアプリで気に入らない点の 1 つは、あらゆる場所でスマート ポインターが使用されていることです (SPtr が範囲外になると常にミューテックス呼び出しが行われます)。これを書いた人は SPtrs にはまっているようです。多くの関数は SPtr を引数として取ります。

アプリケーションは数時間正常に実行できますが、ロック時に突然ミューテックス EINVAL を取得します (リターン コード 22)。コア ダンプを確認したところ、異なるスタック トレースが表示され、原因となった場所は 1 つではありませんでした。

これをデバッグするためにどのツールをお勧めしますか? これは、メモリまたはスタックの破損 (ミューテックスとは関係のないもの) が原因で発生する可能性がありますか? 御時間ありがとうございます。

4

1 に答える 1

2

EINVALpthread_mutex_lockロックが正しく初期化されていないことを意味します。また、によってロックが破棄されたことを意味する場合もありますpthread_mutex_destroy。メモリまたはスタックが破損している場合、つまりランダムなガベージでミューテックス オブジェクトを上書きした場合、またはデストラクタが呼び出された後にミューテックスでオブジェクトを使用しようとしている場合、これらのいずれかが発生する可能性があります。

gdb でミューテックス オブジェクトを出力すると、次のように表示されます。

$5 = {
  __data = {
    __lock = 0, 
    __count = 0, 
    __owner = 0, 
    __nusers = 0, 
    __kind = -1, 
    __spins = 0, 
    __list = {
      __prev = 0x0, 
      __next = 0x0
    }
  }, 
  __size = '\000' <repeats 16 times>"\377, \377\377\377", '\000' <repeats 19 times>, 
  __align = 0
}

この場合、kind-1 のフィールドはミューテックスが破棄されたことを意味します。0、1、または 2 の種類フィールドは、有効なミューテックスを意味します。他のフィールドにはすべて、小さな整数または有効なポインターが含まれている必要があります。ランダムに見えるガベージが表示された場合、ミューテックスが何かによって破壊された可能性があります。

于 2013-03-03T20:02:15.877 に答える