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

用于有界指令跟踪的GDB python脚本,gdb,gdb-python,Gdb,Gdb Python,我正试图编写一个GDB脚本来在一个有界的maner(即start addr和stop addr)中进行指令跟踪。也许我在谷歌失败了,但我似乎已经找不到这样的存在 以下是我的尝试: python def start_logging(): gdb.execute("set logging on") gdb.execute("while $eip != 0xBA10012E9") gdb.execute("x/1i $eip") gdb.execute("st

我正试图编写一个GDB脚本来在一个有界的maner(即start 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脚本新手

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

首先,看起来您正试图在对gdb.execute的多个调用中拆分多行gdb命令。我认为这行不通。当然,这是不打算工作的

其次,没有理由尝试通过gdb.execute执行“while”循环。最好直接在Python中执行

第三,我认为“命令”行似乎也大错特错。我真的不明白它想做什么,我想当遇到断点时调用start\u日志记录?然后继续?嗯,它不会像写的那样工作

我的建议是:

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

如果您真的需要日志记录,可以执行“设置日志记录”业务,或者直接指示gdb.execute返回一个字符串并从Python进行日志记录。

感谢您的响应,我认为gdb.execute是执行命令所必需的,当我将它们放在文件中时,它失败了吗?我尝试将多行gdb命令作为一个字符串放入gdb.execute中,但它似乎也不喜欢这样,这就是为什么它们是多行命令。对于您提出的示例,我将尝试使用break命令,而不是使用break命令(这正是我对代码的意图),用您的更新更新了我的脚本,现在我遇到的问题是设置了断点,而在gdb端,它似乎认为它告诉应用程序运行,因为它只是挂起等待。但应用程序仍然认为其已停止。如果我按住ctrl+Cgdb键,然后手动键入continue,它就可以工作了。但是为什么我的剧本中的连续体不起作用呢?