首页 > 解决方案 > 如何将流程执行记录为汇编指令?

问题描述

我正在编写一个 x86-64 解释器,作为调试和测试程序的一种方式,我需要将该过程记录为汇编指令列表,最好采用 at&t 语法,同时忽略动态库函数调用。并记录cpu寄存器

你知道任何可以提供帮助的工具吗?

我尝试使用 gdbrecord save ...命令,但输出文件与源程序相比非常大

int main() {
  return 42;
}

反汇编文件后指令地址错误。

对于上面的程序,我想要的输出格式是这样的(用 tcc 编译)

  400300: 31 ed                    xor    %ebp,%ebp
  400302: 49 89 d1                 mov    %rdx,%r9
  400305: 5e                       pop    %rsi
  400306: 48 89 e2                 mov    %rsp,%rdx
  400309: 48 83 e4 f0              and    $0xfffffffffffffff0,%rsp
  40030d: 50                       push   %rax
  40030e: 54                       push   %rsp
  40030f: 4c 8b 05 62 02 20 00     mov    0x200262(%rip),%r8        # 600578
  400316: 48 8b 0d 63 02 20 00     mov    0x200263(%rip),%rcx           # 600580
  40031d: 48 8b 3d 64 02 20 00     mov    0x200264(%rip),%rdi        # 600588
  400324: ff 15 66 02 20 00        callq  *0x200266(%rip)        # 600590
__libc_start_main
  400331: 55                       push   %rbp
  400332: 48 89 e5                 mov    %rsp,%rbp
  400335: 48 81 ec 00 00 00 00     sub    $0x0,%rsp
  40033c: b8 2a 00 00 00           mov    $0x2a,%eax
  400341: c9                       leaveq
  400342: c3                       retq
  40032a: f4                       hlt
42

标签: linuxassemblygdbtraceatt

解决方案


我找到了使用 qemu 的部分解决方案。

qemu-x86_64 -singlestep -d in_asm,cpu,fpu -dfilter beg..end myProgram 2>&1 | vim -

用程序的第一个和最后一个指令地址替换begend你可以找到它们

objdump -d yourProgram | vim -

请注意,我绘制矩形的非常简单的程序的输出文件为 55MB。而且运行速度很慢。


推荐阅读