x86汇编中的奇怪分段错误

时间:2015-08-04 09:52:48

标签: c linux assembly segmentation-fault gdb

虽然我在x86-Linux中调试了分段错误,但我遇到了这个问题:

这里是来自GDB的seg-fault消息

0xe2a5a99f in my_function (pSt=pSt@entry=0xe1d09000, version=43)

这是故障组件:

0xe2a5a994 <my_function>      push   %ebp
0xe2a5a995 <my_function+1>    push   %edi
0xe2a5a996 <my_function+2>    push   %esi
0xe2a5a997 <my_function+3>    push   %ebx
0xe2a5a998 <my_function+4>    lea    -0x100b0c(%esp),%esp
0xe2a5a99f <my_function+11>   call   0xe29966cb <__x86.get_pc_thunk.bx>
0xe2a5a9a4 <my_function+16>   add    $0x9542c,%ebx

如上所示,断层线是&#34;调用get_pc_thunk&#34;这只是获得pc值。 并且,我检查了0xe29966cb的内存是否有效并可通过以下命令访问:

(gdb) x/10i 0xe29966cb
   0xe29966cb <__x86.get_pc_thunk.bx>:  nop
   0xe29966cc <__x86.get_pc_thunk.bx+1>:        nop
   0xe29966cd <__x86.get_pc_thunk.bx+2>:        nop
   0xe29966ce <__x86.get_pc_thunk.bx+3>:        nop
   0xe29966cf <__x86.get_pc_thunk.bx+4>:        nop
   0xe29966d0 <__x86.get_pc_thunk.bx+5>:        nop
   0xe29966d1 <__x86.get_pc_thunk.bx+6>:        nop
   0xe29966d2 <__x86.get_pc_thunk.bx+7>:        nop
   0xe29966d3 <__x86.get_pc_thunk.bx+8>:        mov    (%esp),%ebx
   0xe29966d6 <__x86.get_pc_thunk.bx+11>:       ret    

看起来非常好。 但奇怪的是,如果我使用&#34; si&#34;进入&#34; get_pc_thunk&#34;功能,它甚至没有进入第一个nop。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

CALL(或PUSH MOV (%esp))指令崩溃几乎总是由于堆栈溢出造成的。

检查程序是否有无限(或非常深)递归。

另外,这个:

0xe2a5a998 <my_function+4>    lea    -0x100b0c(%esp),%esp

表示my_function为当前堆栈帧分配略超过1MB的局部变量。现在你知道为什么这可能不是一个好主意。