C x86汇编中的奇怪分段错误

C x86汇编中的奇怪分段错误,c,linux,assembly,segmentation-fault,gdb,C,Linux,Assembly,Segmentation Fault,Gdb,在x86 Linux中调试分段错误时,我遇到了以下问题: 下面是来自GDB的seg故障信息 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>

在x86 Linux中调试分段错误时,我遇到了以下问题:

下面是来自GDB的seg故障信息

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
0xe2a5a994推送%ebp
0xe2a5a995推送%edi
0xe2a5a996推送%esi
0xe2a5a997推送%ebx
0xe2a5a998 lea-0x100b0c(%esp),%esp
0xe2a5a99f调用0xe29966cb
0xe2a5a9a4添加$0x9542c,%ebx
正如您在上面所看到的,错误行是“call get_pc_thunk”,它只是获取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    
(gdb)x/10i 0xe29966cb
0xe29966cb:nop
0xe29966cc:nop
0xe29966cd:nop
0xe29966ce:nop
0xe29966cf:nop
0xe29966d0:nop
0xe29966d1:nop
0xe29966d2:nop
0xe29966d3:mov(%esp),%ebx
0xe29966d6:ret
看起来很好。 但奇怪的是,如果我使用“si”进入“get_pc_thunk”功能,它甚至不输入第一个nop就可以识别故障


任何帮助都将不胜感激。

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

检查您的程序是否存在无限(或非常深)递归

此外,这:

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

意味着
my_函数
正在为当前堆栈帧分配略多于1MB的局部变量。现在您知道了为什么这可能不是一个好主意。

那么,0xe29966cb段的权限是什么?它是可执行的。get_pc_thunk由上一个函数调用,没有任何问题。检查堆栈指针,
call
想要推送返回地址,可能堆栈空间已用完。事实上,前面的指令从
esp
中减去了一个大数字,所以这很可能就是问题所在。要想知道@Jester的建议是否正确,请在调用get\u pc\u thunk之前尝试将某些内容推到堆栈上。如果这是真的,那么推送将失败。从esp中减去通常是在堆栈上分配内存的一种方法。lea指令在堆栈上分配大约1Mb的内存,可能类似于
int*big_数组[1051404]。应该使用
malloc
或其他方法动态分配这种内存。