Assembly ESP在/proc/pid/maps和binary中不同
我正在调试崩溃,我看到以下行为- 当我将GDb附加到进程和do信息寄存器时,我看到esp的以下值- esp 0xfd2475d0 0xfd2475d0 在对崩溃的代码进行反汇编时,我看到以下内容- 81c886a:c7 04 24 2c f9 8a 0c movl$0xc8af92c,(%esp) 若我在/proc//maps中查看maps文件,我会看到堆栈地址范围为- fff39000-fff59000 rwxp 7ffffffde000 00:00 0[堆栈] 显然,GDB中ESP 0xfd2475d0的值与maps文件中的堆栈地址不同步 这可能是坠机的原因吗。我想应该是因为我得到了SIGSEGV。另外,我如何解决这个问题Assembly ESP在/proc/pid/maps和binary中不同,assembly,crash,gdb,core,Assembly,Crash,Gdb,Core,我正在调试崩溃,我看到以下行为- 当我将GDb附加到进程和do信息寄存器时,我看到esp的以下值- esp 0xfd2475d0 0xfd2475d0 在对崩溃的代码进行反汇编时,我看到以下内容- 81c886a:c7 04 24 2c f9 8a 0c movl$0xc8af92c,(%esp) 若我在/proc//maps中查看maps文件,我会看到堆栈地址范围为- fff39000-fff59000 rwxp 7ffffffde000 00:00 0[堆栈] 显然,GDB中ESP 0xfd
请协助是的,这显然是分段错误的原因。实际上,不抛出它是非常不明智的,因为Intel体系结构支持分配单独的代码、数据和堆栈段,并且所有内存访问(基址寄存器==ebp或esp)都隐式通过堆栈段 因为编译器将使用不同的基址寄存器(和不同的隐式段寄存器)来读取任何其他任意指针,这将缩小堆栈寄存器损坏的搜索范围 更罕见的可能性是堆栈崩溃,即访问当前函数范围中除局部变量之外的其他堆栈元素——在这种特殊情况下,会损坏调用方的堆栈/帧指针
void foo(int *p) {
int a[2];
a[4] = p;
}
更可能的选择是过度分配
void foo() {
double too_big[6000000]; // this would be located at 0xfd......
int a; // this would be located at 0xfff3f000 ...
}
请注意,主流操作系统不使用分段,因此它们不会捕获指定堆栈区域之外的访问(只有通常的内存保护适用)。如果使用线程或sigaltstack,这一点很重要,在这种情况下,其他内存块用作堆栈。