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 回答