您好,
0x08048981 <+1165>: call 0x8048404 <printf@plt>
0x08048986 <+1170>: jmp 0x8048a52 <main+1374>
0x0804898b <+1175>: mov -0x38(%ebp),%eax
0x0804898e <+1178>: mov -0x24(%ebp),%edx
0x08048991 <+1181>: mov (%eax,%edx,4),%eax
0x08048994 <+1184>: sub $0x4,%eax
=> 0x08048997 <+1187>: mov (%eax),%ebx
如何获得汇编指令的相应C语句。指令在 地址0x08048997是segfault的位置,如图所示为gdb,我在gdb中使用'disassemble'命令获得了上面的程序集。
谢谢, 卡皮尔
答案 0 :(得分:3)
由于您正在使用gdb,我将假设您正在使用gcc进行编译。编译时添加-g
标志,然后将可执行文件加载到gdb中。我打算用这个小程序作为例子:
#include <stdio.h>
int main(void)
{
char *str = "hello";
*str = 'a'; /* Will cause a segfault, trying to modify read-only memory */
return 0;
}
即。 gcc -g -o test test.c
当我在gdb中运行程序时,它会崩溃并产生这个输出:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400484 in main () at test.c:7
7 *str = 'a';
正如您所看到的,由于调试信息已添加到可执行文件中,因此gdb会告诉您错误发生的位置并向您显示它出现的行。我还可以使用list 7
或list *0x400484
来查看导致错误的代码行。
您仍然可以使用disas
查看发生错误的汇编指令:
...
0x0000000000400480 <+12>: mov rax,QWORD PTR [rbp-0x8]
=> 0x0000000000400484 <+16>: mov BYTE PTR [rax],0x61
0x0000000000400487 <+19>: mov eax,0x0
...
我认为我发布的帖子比需要的时间更长......如我在开始时提到的那样,如果你使用gcc来更有效地调试gdb,那么就添加-g
标志。