如何测试eax,eax产生信号11?

时间:2016-05-20 15:00:12

标签: linux assembly x86 x86-64

Program terminated with signal 11, Segmentation fault.

(gdb) info registers 
rax            0x0      0
rip            0x496272 0x496272 <my_function+464>
eflags         0x10202  [ IF RF ]

有问题的代码看起来像这样。

if ( ... a->b->c.d & 0x100 ... )

反汇编是

   0x0000000000496262 <+448>:   mov    rax,QWORD PTR [rbp-0x30]
   0x0000000000496266 <+452>:   mov    rax,QWORD PTR [rax+0x10]
   0x000000000049626a <+456>:   mov    eax,DWORD PTR [rax+0x48]
   0x000000000049626d <+459>:   and    eax,0x100
=> 0x0000000000496272 <+464>:   test   eax,eax
   0x0000000000496274 <+466>:   je     0x49628b <my_function+489>
...
   0x0000000000496286 <+484>:   jmp    0x49636f <my_function+717>
   0x000000000049628b <+489>:   mov    rax,QWORD PTR [rbp-0x30]
   0x000000000049628f <+493>:   mov    rax,QWORD PTR [rax+0x10]

似乎没有任何内存访问问题,因为GDB可以打印访问的字段,并且代码在mov操作上没有错误。

(gdb) p a->b->c.d
$1 = 0

没有其他线程同时运行。

我的猜测目前是问题出在其他地方,而GDB或核心文件的信息不完整或不正确。

  • 构建机器是SLES9
  • 编译器是GCC 3.4.4
  • 执行主机是RHEL6.4
  • GDB是7.2-60.el6

0 个答案:

没有答案