C x86汇编中的奇怪分段错误
在x86 Linux中调试分段错误时,我遇到了以下问题: 下面是来自GDB的seg故障信息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>
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
或其他方法动态分配这种内存。