straceがトレースしているプログラムに異常を引き起こす可能性があるかどうか知りたいのですが。現在、私が呼び出した行で発生したランダムセグメンテーション違反エラー(ただし、straceを使用するとプログラムがそのようにクラッシュすることはないようです)をトレースしようとしていますpthread_cond_wait()
。
プログラムを直接実行すると(実際にはc / c ++が混在しています)、想定どおりに動作する場合がありますが、前述のように、pthread_cond_wait()
(ちなみに、誰かがその問題を解決したい場合は)でクラッシュすることがあります。 、ここを参照してください、どんな助けでも大歓迎です)。
プログラムを直接実行し、次のようにstraceをプロセスにアタッチする場合:
strace -ttTD -o strace_today.txt -p PROCESS_ID
出力は、futexを待機していることを示すワンライナーです(事実上次のように:)
futex(x,FUTEX_WAIT_PRIVATE,x)
次のようにstraceからプログラムを実行すると、次のようになります。
strace -ttTD -o strace_today.txt example_program
次に、ファイル出力のある時点で、正確には、を呼び出すとpthread_cond_wait()
、このような複数の行でスパムを送信し続けます(そして、毎回、futex()
呼び出しが待機している値は以前よりも高くなります。ここでは15です)
12:46:15.636366 semop(11599962, {{0, -1, 0}}, 1) = 0 <0.000031>
12:46:15.636512 futex(0x8053838, FUTEX_WAKE_PRIVATE, 1) = 0 <0.000033>
12:46:15.636637 futex(0x8053864, FUTEX_WAIT_PRIVATE, 15, NULL) = ? ERESTARTSYS (To be restarted) <0.002034>
12:46:15.638832 futex(0x8053864, FUTEX_WAIT_PRIVATE, 15, NULL) = 0 <0.001449>
12:46:15.640436 clone(child_stack=0xb6cd0484, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xb6cd0bd8, {entry_number:6, base_addr:0xb6cd0b70, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, child_tidptr=0xb6cd0bd8) = 25403 <0.000045>
12:46:15.640598 semop(11599962, {{0, -1, 0}}, 1) = 0 <0.000015>
また、プロセスの親ではなく子としてstraceを実行しようとしました(違いが生じることを期待して)。そして、私はそのランダムなセグメンテーション違反エラーをキャッチしようとしましたが、それは決して現れませんでした。
さて、私の質問は、これが一般的で意図的なものなのか、それとも私のstrace-callが偽物なのかということです。そうでない場合は、straceで機能しない可能性があるため、注意する必要のあるシステムコールはありますか、それともこの奇妙な動作はシステムコールのグループに関係しますか?これを回避する方法はありますか?
私はdebian-squeezeを使用しています。
アップデート1
私は複数のスレッド(POSIXスレッド)といくつかの子を実行していることを完全に忘れました。はレースに遭遇するpthread_cond_wait()
べきではありませんが、それは間違いなく、pthread_mutex_lock()
にアクセスし、pthread_cond_t
引数pthread_mutex_t
として解析しているaの後の最初の呼び出しであるためです。pthread_cond_wait()
しかし、内部に競合状態があるかどうかはわかりません。必要に応じてプログラムコードを提供します。