【问题标题】:Is there a way to retrieve the full assembly execution trace of a C program? [duplicate]有没有办法检索 C 程序的完整程序集执行跟踪? [复制]
【发布时间】:2020-11-27 04:15:48
【问题描述】:

我有几个基本上想反汇编的 C 程序。我正在使用 objdump,但我意识到这是静态反汇编。有没有办法获得完整的程序集级跟踪按顺序执行的指令的程序?我在 x86-64 上运行。

【问题讨论】:

  • 这就是调试器的目的。
  • 一旦你点击了一个条件分支(依赖于程序外部的东西),那么你的执行顺序反汇编就结束了
  • 等等,你不想要调用堆栈回溯,你想要每条指令按执行顺序吗?您的标签和标题使用的术语与 GDB 的 bt 命令相匹配。但是您真正想要的是执行跟踪,而不仅仅是堆栈。如果这不是您想要的,请edit您的问题以删除“堆栈”内容。
  • 我编辑了我的问题以删除堆栈内容。是的,我基本上只想要按顺序执行程序集的指令。如果我必须模拟它们或使用调试器,有没有办法将该信息转储到文件中?
  • How to run record instruction-history and function-call-history in GDB? 有一些关于 GDB 的详细信息,它使用 intel-pt 等硬件支持,而不是缓慢地单步执行每条指令。

标签: c assembly trace


【解决方案1】:

有没有办法在汇编级别检索 C 程序的完整堆栈跟踪/执行跟踪?

调用堆栈甚至可能不存在。一些 C 实现可以(在一些简单的情况下)内联每个函数调用并在寄存器中工作(但Rice's theorem 表明这并不总是可能的)。这可能发生在最近的 GCC 进行整个程序链接时优化(例如,在编译和链接步骤中调用 with gcc -O3 -flto -fwhole-program

但是,如果您使用 Linux/x86-64 并且想要在运行时检索调用堆栈,请考虑使用 Ian Taylor 的 libbacktrace。它是一些最近的GCC编译器的一部分。

有没有办法获得按顺序执行的指令的程序的完整汇编级跟踪?

或者,使用和/或修补一些处理器模拟器,例如Qemu

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2021-01-18
    • 2020-12-14
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多