0

私は GDB スクリプトを作成して、限定された方法で命令トレースを実行しようとしています (つまり、addr を開始して addr を停止します)。おそらく私はグーグルで失敗していますが、これがすでに存在しているとは思えません。

ここに私の刺し傷があります:

python

def start_logging():
     gdb.execute("set logging on")
     gdb.execute("while $eip != 0xBA10012E9")
     gdb.execute("x/1i $eip")
     gdb.execute("stepi")
     gdb.execute(" end")
     gdb.execute("set logging off")

gdb.execute("set pagination off")
gdb.execute("break *0xBA19912CF")
gdb.execute("command 1 $(start_logging())")
gdb.execute("continue")

私の考えでは、これはブレークポイントを設定し、コマンドがヒットしたときに実行するように設定する必要があります。ブレークポイントに到達すると、終了アドレスに到達するまでコードをシングル ステップで実行し、ログをオフにします。

これを gdb で実行すると、アプリケーションは正しい時点で中断しますが、コマンドは実行されません。

私は何を間違っていますか?これが間違った方法である場合は申し訳ありませんが、私に知らせてください。私はgdbスクリプトを初めて使用します

4

1 に答える 1

1

ここにいくつかの奇妙なものが見えます。

まず、複数行の gdb コマンドを gdb.execute への複数の呼び出しに分割しようとしているようです。私はこれがうまくいくとは思わない。確かに、それは機能することを意図していません。

第二に、gdb.execute を介して "while" ループを実行しようとする理由はありません。Python で直接実行する方がよいでしょう。

第三に、「コマンド」ラインもかなり間違っていると思います。何をしようとしているのかよくわかりません。ブレークポイントに到達したときに start_logging を呼び出すと思いますか? そして続けますか?うーん、書いた通りにはなりません。

私が提案するのは次のようなものです:

gdb.execute('break ...')
gdb.execute('run')
while gdb.parse_and_eval('$eip') != 0x...:
  gdb.execute('stepi')

本当にログが必要な場合は、「ログの設定」ビジネスを実行するか、gdb.execute に文字列を返して Python からログを記録するように指示します。

于 2014-04-04T02:14:31.087 に答える