在Visual Studio中监视调用堆栈大小
Monitoring call stack size in Visual Studio
在Visual Studio中有监控调用堆栈大小的方法吗?运行时会提供一个调用堆栈窗口,但不会显示堆栈的大小。我正在使用C++并面临堆栈溢出问题。我知道我使用的一些递归函数可能有问题,但在解决这些问题之前,我想监控调用堆栈的大小,看看发生了什么。
在这里使用数据断点会很有帮助。无论你在代码中的哪个位置,只要你在正确的线程上,使用Debug+NewBreakpoint+NewDataBreakpoint都没关系。在地址框中键入@esp - 250000
。按F5继续运行,当四分之一的可用堆栈空间被消耗时,它将在递归内部的某个地方中断。esp的确切偏移量并不重要。
有几种方法:
- 在监视窗口中检查ESP。您可以通过在监视窗口中监视
@esp
来执行此操作。将其与ESP在流程开始时的情况进行比较 - 类似地,检查第一个/最后一个堆栈帧中堆栈分配变量的地址
请注意,堆栈通常是向后分配的,因此随着堆栈的增长,ESP会越来越小。
"Microsoft推荐的本机规则"代码分析可以查看您的代码,并发现可能溢出堆栈的代码问题。我不确定它在发现递归问题方面有多好,但它确实在我的代码中发现了一个问题,我使用了一个非常大(1MB)的类的本地实例。在运行时,唯一的错误是堆栈溢出。当然,在堆栈上使用大型对象是个坏主意;您应该只使用小对象和将大部分脏衣物存储在堆中的对象。
在VS2012中,右键单击项目属性,然后选择代码分析并单击复选框以启用代码分析。跑步需要几分钟。
相关文章:
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- 是否可以检查悬挂光纤的调用堆栈?
- MSVC __debugbreak() 与 openGL 错误回调一起使用时不会产生调用堆栈
- 了解使用堆栈实现队列的递归调用机制
- C++析构函数调用两次,堆栈分配的复合对象
- 以下代码如何工作以每次为唯一调用堆栈唯一实例化模板函数?
- OpenCV 3 Visual Studio 2017 调试,调用堆栈没有.pdb文件
- C/C++中全局调用堆栈的基础
- 是否可以访问代码中的调用堆栈?
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 调用堆栈显示 SIGBUS,这意味着什么
- 堆栈展开如何与析构函数调用有关?
- 打开C++故障转储不会在调用堆栈中显示正确的行
- 防止 CRTP 特征码在"pure virtual"调用中堆栈溢出
- 将参数推送到调用堆栈 (C++) 的可移植方法
- 从基类堆栈调用派生类实例
- 堆栈调用析构函数,即使遵循三规则
- 用于生成函数以从运行时堆栈调用带参数的函数的模板