2011-11-08 7 views

答えて

6

catch syscall writewriteシステムコールを実行するたびにGDBを停止させることができます。

writeは名前付きファイルではなくファイル記述子で動作するため、名前でこのブレークポイントを条件付きにすることはできません。最初に "興味深い"ファイルに対応するファイル記述子を見つけなければなりません。

Linuxでは、ls -l /proc/<pid>/fd/*を参照すると、ファイル記述子を名前に関連付けることができます。

他のシステムは、lsof、またはこれを実行するための他のシステム固有のメカニズムを持つ場合があります。

ファイルディスクリプタを取得したら、catchを条件付きにすることができます(GDBは、その特定のファイルが書き込まれたときにのみ停止します)。それを行う方法の正確な詳細は、オペレーティングシステムとプロセッサによって異なり、あなたはどちらも提供しませんでした。

+0

キャッチシステムコールの書き込みが正常に動作します: キャッチポイント2( '書き込み' をシステムコールするために呼び出す)、0x0000003137cc6070 /lib64/libc.so.6の__write_nocancel()内 gdbでファイル記述子を取得する方法は? – agnonchik

+0

「OSとプロセッサーの詳細が違っていて、あなたが使っていることを言っていない」と理解できませんでしたか?あなたはおそらく* Linux/x86_64を使用していますが、何か他のものを使用している可能性があります。 –

+0

私の64ビットシステムでは、奇妙なことにファイル記述子番号を含むrdiレジスタを使用できます。ちょうど[リンク](http://stackoverflow.com/questions/1538463/how-can-i-put-a-breakpoint-on-something-is-printed-to-the-terminal-in-gdb)からわかりました。 – agnonchik

関連する問題