2

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()しかし、内部に競合状態があるかどうかはわかりません。必要に応じてプログラムコードを提供します。

4

2 に答える 2

3

このような問題の原因として最も可能性が高いのは、straceがアプリケーションのタイミングに影響を及ぼし、ロックのバグが発生する可能性があるという事実です。

于 2012-08-11T11:10:44.597 に答える
2

ほぼすべてのC++およびCsegfaultには、ある時点で未定義の動作が含まれています。このため、コンパイラーは、straceの実行時にトリガーされないクラッシュシステムを自由に実装できます。

深刻なことに、straceでは発生しないプログラムのタイミングの問題がどこかにある可能性がありますか?これらのタイミングの問題は、マルチスレッドでは特に厄介です(たとえば、デッドロックはリリースモードでのみ発生します)。

于 2012-08-11T11:11:50.883 に答える