2016-07-27 5 views
2

私はマルチスレッドのLinuxプロセスで、特定のスレッドが数秒間実行されないように見える問題をデバッグしています。 strace出力を見ると、futexを待つことが明らかになった。
1673109 14:36:28.600329のfutex(0x44b8d20、FUTEX_WAIT_PRIVATE、:36:33.221850 < ...のfutexは>再開)= 0 < 4.621514>straceに示されているfutex競合をデバッグするには?

は、どのように私は何本のfutexを見つけることができます(0x44b8d20 )は、ユーザー空間で、つまり内部的にfutexを使用しているロック構成にどのようにマップするかを指します。

答えて

1

私はシンプルなsystemtapスクリプトを使用して、競合するフューテックスロックのアドレスをすばやく見つけるのに役立ちます。

https://sourceware.org/systemtap/examples/process/futexes.stp:あなたが主張ユーザー・スペース・ロックを見つけたシンプルなシステムタップスクリプトをダウンロードすることができます。ここ

http://man7.org/linux/man-pages/man2/futex.2.html

  1. :私は住所を言うとき、私はのfutexシステムコールの最初の引数を参照しています

    システムにシステムタップがインストールされている場合は、このシステムタップスクリプトを起動してください。stap futexes.stp

    1. 以前と同じようにstrace出力をキャプチャします。

    2. Ctrl-Cを押すだけでシステムタップスクリプトの実行を終了すると、競合したフューテックスの出力が得られます。

    3. 最後に、straceの出力で、2番目の引数(操作タイプ)がFUTEX_WAITであるfutex呼び出しを検索します。たとえば:

    のfutex(0x7f58a31999d0、FUTEX_WAIT、4508、NULL)=

    0その後、システムタップスクリプト出力の最初の引数を検索することができます。私はこれの簡単なテストを行ったように、ここでは、対応するシステムのタップ出力を見つける:

    青梅[4489]ロック0x7f58a31999d0たちavgを1回、7807を競合

    あなたはこのシステムタップスクリプトを見ればプロセス名とプロセス/スレッドIDがうまく印刷され、探しているものを簡単に見つけることができます。 ただし、systemtapスクリプトを実行すると実際にシステム全体のフックが行われることに注意してください。

+0

これは本当にスマートですが、残念なことに私はOS Xを使用しています。あなたの投稿のおかげで、私は今ではRubyのプローブでDTraceを使って調べ始めました。それは間違いなく私が前に探検することを考えていなかった道です。 – Reck

関連する問題