0

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

当我将 GDb 附加到进程并执行信息寄存器时,我看到 esp 的以下值 -

特别是0xfd2475d0 0xfd2475d0

在对崩溃的代码进行反汇编后,我看到以下内容 -

81c886a: c7 04 24 2c f9 8a 0c 移动 $0xc8af92c,(%esp)

如果我在 /proc//maps 中查看地图文件,我会看到堆栈地址范围为 -

fff39000-fff59000 rwxp 7ffffffde000 00:00 0 [堆栈]

显然,GDB 中 ESP 0xfd2475d0 的值与映射文件中的堆栈地址不同步。

这可能是崩溃的原因。我认为这应该是因为我正在获得 SIGSEGV。另外,我该如何解决这个问题?

请协助

4

1 回答 1

0

是的,这显然是分段错误的原因。实际上不扔它是非常不明智的,因为英特尔架构支持分配单独的代码、数据和堆栈段——并且所有内存访问(使用基址寄存器 == 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 ... 
 }
于 2012-12-27T09:13:33.267 回答