【问题标题】:GDB python script for bounded instruction tracing用于有界指令跟踪的 GDB python 脚本
【发布时间】:2014-04-03 17:45:52
【问题描述】:

我正在尝试编写一个 GDB 脚本来以有限的方式进行指令跟踪(即开始地址和停止地址)。也许我在谷歌上失败了,但我似乎已经找不到这个存在了。

这是我的尝试:

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 gdb-python


    【解决方案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 记录它。

    【讨论】:

    • 感谢您的回复,我认为 gdb.execute 是执行命令所必需的,当我将它们放在文件中时它会失败吗?我试图将多行 gdb 命令作为一个字符串放在 gdb.execute 中,但它似乎并不喜欢这就是为什么它们是多命令。至于您提出的示例,我将尝试一下,而不是使用 break 命令(这是我对代码的意图)
    • 用你的更新更新了我的脚本,现在我遇到了断点设置的问题,在 gdb 端,它似乎认为它告诉应用程序运行,因为它只是挂起等待。但应用程序仍然认为它已停止。如果我 ctrl+c gdb 然后手动输入 continue 它可以工作。但是为什么我的脚本没有继续工作呢?
    猜你喜欢
    • 2017-02-11
    • 2016-08-20
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多