我试图编写一个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脚本新手
答案 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中记录它。