Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly ESP在/proc/pid/maps和binary中不同_Assembly_Crash_Gdb_Core - Fatal编程技术网

Assembly ESP在/proc/pid/maps和binary中不同

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

我正在调试崩溃,我看到以下行为-

当我将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。另外,我如何解决这个问题


请协助

是的,这显然是分段错误的原因。实际上,不抛出它是非常不明智的,因为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,这一点很重要,在这种情况下,其他内存块用作堆栈。