【问题标题】:Tracing instructions with GDB Python scripting使用 GDB Python 脚本跟踪指令
【发布时间】:2017-02-11 18:07:33
【问题描述】:

我正在尝试为 GDB 编写 Python 脚本来跟踪函数。

这个想法是在地址位置设置断点,让程序运行,然后,当它中断时,记录到文件寄存器、向量和堆栈,并找出下一条指令的地址,然后在该地址上设置断点定位并冲洗并重复。

我通读了文档,我非常有信心可以轻松转储寄存器、向量和内存位置。实际的问题是找到下一条指令的位置,因为它需要分析当前指令的反汇编以确定下一个断点应该放置在哪里。

更新

我在不使用stepinexti 的情况下执行所有这些操作,因为我正在调试的目标仅适用于硬件断点,并且据我所知,这些命令使用软件断点在下一条指令处中断

GDB 中有类似的东西吗?

【问题讨论】:

    标签: gdb gdb-python


    【解决方案1】:

    是的,您可以在 gdb 中执行此操作。与其尝试在下一条指令上设置断点,不如使用si 命令单步执行下一条指令。

    【讨论】:

    • 我忘了补充一点,我不能对正在调试的目标使用软件断点。我需要用硬件断点来做。据我所知,si 使用软件断点在下一条指令处停止。
    • 你没有提到目标。在 Linux 上,一步只是一个ptrace 请求,我认为最终通常使用芯片上的调试寄存器来实现。无论如何,如果这对您不起作用,那么您就只能靠自己了。 gdb 在这方面确实有一些逻辑(主要用于反向,但也用于“脱线”步进),但无法从 Python 访问此信息。
    • 目标是 Android,所以它仍然是一个底层的 Linux。我应该看看 Android NDK 中的 gdbserver 实现,以检查它们使用的是什么。能够通过 Python 提取一些信息并最终将其通过管道传输到 Capstone 以完成找出下一条指令的艰苦工作,这将非常有帮助。
    • 我不知道 capstone 需要什么,但很容易从 Python 读取内存并将其交给任何你喜欢的人。
    • 是的,我想我会尝试读取内存并将转储导出到顶点以返回指令列表。给定足够的上下文,Capstone 应该能够找出下一条指令地址是什么。顺便说一句,你知道为什么硬件断点没有导出到 Python 吗?
    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2013-05-26
    相关资源
    最近更新 更多