如果 EBP 帧指针为 NULL,堆栈是否损坏

Is the stack corrupted if the EBP frame pointer is NULL?

本文关键字:堆栈 是否 损坏 NULL EBP 指针 如果      更新时间:2023-10-16

我对堆栈跟踪的理解基本上是基于 基指针和堆栈指针到底是什么?他们指向什么?

我多年来一直在帮助开发的一个程序在崩溃时会吐出一个堆栈转储,我已经习惯于评估这些堆栈跟踪,这与C++编译器生成的 .map 文件相对应。 很多时候,我已经成功地浏览堆栈并调试问题。

但是,有时堆栈跟踪具有空 EBP(帧(指针。 以下是此类示例堆栈转储的相关代码段:

Initial EBP pointer value: 04d8fab0
{at address 04d8fab0: 00000000}

如您所见,EBP 帧指针的值为 NULL。 因此,我不能走堆栈。

这是堆栈损坏的迹象,还是有其他可能的解释?

如您所见,EBP 帧指针的值为 NULL。因此 我不能走堆栈。这是堆栈损坏的标志,还是 还有另一种可能的解释吗?

我认为还有另一种解释,其根源在于,除了保存当前堆栈帧的地址外,EBP 寄存器还可以用于任何其他目的,例如通用寄存器。为了安全地做到这一点,需要做两件事:

  1. 通过调用将其当前内容存储到堆栈

    推送EBP

  2. 在常规用途使用之后和退出当前进程之前通过调用还原内容

    流行音乐

所以我认为您遇到的情况不一定是由堆栈损坏引起的,因为从技术上讲,转储可能是在 EBP 寄存器临时用于流程代码中的其他地方用于通用用途时生成的,甚至可能不是您编写的代码。