32

巨大なアプリケーションのどこから特定のメッセージが出力されるのか知りたいです。アプリケーションは非常に大きくて古いため、考えられるすべての方法でテキストを端末に出力します。たとえば、printf()、fprintf(stdout、...) など。

write() システム コールにブレークポイントを設定するために書き込みを行いますが、write() を使用するさまざまなファイル I/O 操作のために、あまりにも多くのブレークポイント停止が発生します。

したがって、基本的に、プログラムが端末に何かを出力するたびにgdbを停止させたいのですが、同時に、プログラムがファイルに何かを書き込むときにgdbを停止させたくありません。

4

2 に答える 2

33

最初のパラメーターをチェックする条件付きブレークポイントを使用します。64 ビット x86 システムでは、条件は次のようになります。

(gdb) b write if 1==$rdi

32 ビット システムでは、パラメーターがスタック上にあるため、より複雑になります。つまり、$esp を int * にキャストし、fd パラメーターにインデックスを付ける必要があります。その時点でのスタックには、戻りアドレス、長さ、バッファー、そして最後に fd があります。

これは、ハードウェア プラットフォームによって大きく異なります。

于 2009-10-08T15:20:40.630 に答える
17

gdb 7.0 では、syscall write() に条件付きブレークポイントを設定できます。

(gdb) catch syscall write
Catchpoint 1 (syscall 'write' [4])
(gdb) condition 1 $ebx==1

$ebx には最初の syscall パラメータが含まれます - ここに FD 番号

于 2010-01-06T20:09:41.463 に答える