用于有界指令跟踪的GDB python脚本

时间:2014-04-03 17:45:52

标签: gdb gdb-python

我试图编写一个GDB脚本来在有界管理器中进行指令跟踪(即启动addr和stop 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脚本新手

1 个答案:

答案 0 :(得分:1)

我在这里看到一些奇怪的东西。

首先,看起来你试图在多次调用gdb.execute时拆分多行gdb命令。我不相信这会奏效。当然它并不打算工作。

其次,没有理由尝试做"而#34;通过gdb.execute循环。最好直接在Python中进行。

第三,我认为"命令"这条线看起来也很错误。我没有真正得到它想要做的事情,我想在断点被击中时调用start_logging?然后继续?好吧,它不会像书面那样工作。

我建议的是:

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

如果您真的想要记录,请执行'设置记录' business或者只是指示gdb.execute返回一个字符串并从Python中记录它。