装配指令以违反C语句

时间:2011-11-07 06:54:25

标签: assembly gdb segmentation-fault

您好,

   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'命令获得了上面的程序集。

谢谢, 卡皮尔

1 个答案:

答案 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 7list *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标志。