0

非常にまれなデッドロックをデバッグしようとしていますが、タイプ 1 (再帰的) の pthread_mutex の問題に絞り込みました。このミューテックスがどこから来ているのかを追跡したいのですが、私たちのコードはすべて通常のミューテックスを使用しているので、いつミューテックス タイプ == 再帰的であるかを検出して追跡することが理にかなっていると思いました。

pthread_mutex_lock に手動ブレークポイントを設定したり、スタック ポインターを介して pthread_mutex_t を逆参照したりして、その型を調べようとしましたが、これは何百万回も呼び出され、mutex 型 == 再帰のケースをキャッチするのに永遠に時間がかかります。

また、ライブラリを挿入し、pthread_mutex_lock を置き換えてミューテックス タイプにブレークポイントを設定できるようにしようとしましたが、ヒットしませんでした (これが pthread_mutex_lock へのすべての呼び出しをキャッチしているとは確信していませんでした)。

再帰型のミューテックスで pthread_mutex_lock が呼び出されるたびに、ウォッチポイント/条件付きブレークポイントを設定する方法がgdbにあるに違いないと感じていますか?

上記のヘルプをいただければ幸いです。前もって感謝します。

4

3 に答える 3

0

あなたは試すことができます:

(gdb) conditional yourbreakpointid mutex.__m_kind==PTHREAD_MUTEX_RECURSIVE

mutexスコープ内のミューテックスの名前とyourbreakpointid、関数に配置したブレークポイントの ID はどこにありますか。

__m_kind は実装によって名前が変わる場合があります。これが機能しない場合は、ディストリビューション ヘッダー (pthread.h) を検索してください。

于 2012-08-24T09:38:07.597 に答える
0

ブレークポイントの代わりにgdb、ウォッチポイントを使用できます

于 2012-08-24T09:32:37.527 に答える