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代码行相关联?
在这个小样本中,它并不太难,但在较大的程序中,当调试大量代码时,它会变得有点麻烦.
但有没有办法提取哪些程序集与特定的C代码行相关联?
是的,原则上 - 您的编译器可能会这样做(-fverbose-asm例如GCC选项).或者,objdump -lSd或类似的将使用可用的源和行号注释来反汇编程序或目标文件.
但总的来说,对于大型优化程序,这可能很难遵循.
即使使用完美的注释,您也会看到多次提到相同的源代码行,因为表达式和语句被拆分,交错和重新排序,以及一些与多个源表达式相关的指令.
在这种情况下,您只需要考虑源和程序集之间的关系,但需要花费一些精力.
小智 3
我为此找到的最好的工具之一是 Matthew Godbolt 的Compiler Explorer。
它具有多个编译器工具链,自动重新编译,并立即用彩色线显示汇编输出,以显示相应的源代码行。