如果 EBP 帧指针为 NULL,堆栈是否损坏
Is the stack corrupted if the EBP frame pointer is NULL?
我对堆栈跟踪的理解基本上是基于 基指针和堆栈指针到底是什么?他们指向什么?
我多年来一直在帮助开发的一个程序在崩溃时会吐出一个堆栈转储,我已经习惯于评估这些堆栈跟踪,这与C++编译器生成的 .map 文件相对应。 很多时候,我已经成功地浏览堆栈并调试问题。
但是,有时堆栈跟踪具有空 EBP(帧(指针。 以下是此类示例堆栈转储的相关代码段:
Initial EBP pointer value: 04d8fab0
{at address 04d8fab0: 00000000}
如您所见,EBP 帧指针的值为 NULL。 因此,我不能走堆栈。
这是堆栈损坏的迹象,还是有其他可能的解释?
如您所见,EBP 帧指针的值为 NULL。因此 我不能走堆栈。这是堆栈损坏的标志,还是 还有另一种可能的解释吗?
我认为还有另一种解释,其根源在于,除了保存当前堆栈帧的地址外,EBP 寄存器还可以用于任何其他目的,例如通用寄存器。为了安全地做到这一点,需要做两件事:
-
通过调用将其当前内容存储到堆栈
推送EBP
-
在常规用途使用之后和退出当前进程之前通过调用还原内容
流行音乐
所以我认为您遇到的情况不一定是由堆栈损坏引起的,因为从技术上讲,转储可能是在 EBP 寄存器临时用于流程代码中的其他地方用于通用用途时生成的,甚至可能不是您编写的代码。
相关文章:
- 堆栈和队列是否像C++中的数组一样传递?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- 是否可以检查悬挂光纤的调用堆栈?
- "new"创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 是否可以访问代码中的调用堆栈?
- 堆栈变量超出范围时是否解除分配?
- 唯一指针是否在堆或堆栈上分配内存?
- C++,在对象内分配多个数据时,堆栈分配是否更有效? 在下面的程序中,类A_Heap的效率会更低吗?
- 对象向量是否在堆或堆栈上分配C++?
- 有什么方法可以检测我的类的对象是否在堆栈上创建
- 是否可以检查存储在堆栈上的单词是否是回文,而C++中没有任何附加数据结构
- 虚拟功能是否不太可能导致堆栈溢出
- 在我的实现中使用堆栈是否正确?
- std :: vector用作堆栈和std :: stack之间是否存在任何复杂性差异
- 查看使用堆栈是否相等的两个字符串
- 如何在C++中检查两个堆栈是否相同
- 如果 EBP 帧指针为 NULL,堆栈是否损坏
- 如何检查堆栈是否损坏