如何将汇编代码与C程序中的确切行关联?

Unh*_*ion 5 c debugging assembly gdb

以下是通过装配网站找到的示例.这是C代码:

 int main()
 {
     int a = 5;
     int b = a + 6;
     return 0;
 }
Run Code Online (Sandbox Code Playgroud)

这是相关的汇编代码:

    (gdb) disassemble
    Dump of assembler code for function main:
    0x0000000100000f50 <main+0>:    push   %rbp
    0x0000000100000f51 <main+1>:    mov    %rsp,%rbp
    0x0000000100000f54 <main+4>:    mov    $0x0,%eax
    0x0000000100000f59 <main+9>:    movl   $0x0,-0x4(%rbp)
    0x0000000100000f60 <main+16>:   movl   $0x5,-0x8(%rbp)
    0x0000000100000f67 <main+23>:   mov    -0x8(%rbp),%ecx
    0x0000000100000f6a <main+26>:   add    $0x6,%ecx
    0x0000000100000f70 <main+32>:   mov    %ecx,-0xc(%rbp)
    0x0000000100000f73 <main+35>:   pop    %rbp
    0x0000000100000f74 <main+36>:   retq   
    End of assembler dump.
Run Code Online (Sandbox Code Playgroud)

我可以放心地假设这行汇编代码:

  0x0000000100000f6a <main+26>:   add    $0x6,%ecx
Run Code Online (Sandbox Code Playgroud)

与此C行相关:

     int b = a + 6;
Run Code Online (Sandbox Code Playgroud)

但有没有办法提取哪些程序集与特定的C代码行相关联?
在这个小样本中,它并不太难,但在较大的程序中,当调试大量代码时,它会变得有点麻烦.

Use*_*ess 5

但有没有办法提取哪些程序集与特定的C代码行相关联?

是的,原则上 - 您的编译器可能会这样做(-fverbose-asm例如GCC选项).或者,objdump -lSd或类似的将使用可用的源和行号注释来反汇编程序或目标文件.

但总的来说,对于大型优化程序,这可能很难遵循.

即使使用完美的注释,您也会看到多次提到相同的源代码行,因为表达式和语句被拆分,交错和重新排序,以及一些与多个源表达式相关的指令.

在这种情况下,您只需要考虑源和程序集之间的关系,但需要花费一些精力.


小智 3

我为此找到的最好的工具之一是 Matthew Godbolt 的Compiler Explorer

它具有多个编译器工具链,自动重新编译,并立即用彩色线显示汇编输出,以显示相应的源代码行。