在Visual Studio中监视调用堆栈大小

Monitoring call stack size in Visual Studio

本文关键字:堆栈 调用 监视 Visual Studio      更新时间:2023-10-16

在Visual Studio中有监控调用堆栈大小的方法吗?运行时会提供一个调用堆栈窗口,但不会显示堆栈的大小。我正在使用C++并面临堆栈溢出问题。我知道我使用的一些递归函数可能有问题,但在解决这些问题之前,我想监控调用堆栈的大小,看看发生了什么。

在这里使用数据断点会很有帮助。无论你在代码中的哪个位置,只要你在正确的线程上,使用Debug+NewBreakpoint+NewDataBreakpoint都没关系。在地址框中键入@esp - 250000。按F5继续运行,当四分之一的可用堆栈空间被消耗时,它将在递归内部的某个地方中断。esp的确切偏移量并不重要。

有几种方法:

  1. 在监视窗口中检查ESP。您可以通过在监视窗口中监视@esp来执行此操作。将其与ESP在流程开始时的情况进行比较
  2. 类似地,检查第一个/最后一个堆栈帧中堆栈分配变量的地址

请注意,堆栈通常是向后分配的,因此随着堆栈的增长,ESP会越来越小。

"Microsoft推荐的本机规则"代码分析可以查看您的代码,并发现可能溢出堆栈的代码问题。我不确定它在发现递归问题方面有多好,但它确实在我的代码中发现了一个问题,我使用了一个非常大(1MB)的类的本地实例。在运行时,唯一的错误是堆栈溢出。当然,在堆栈上使用大型对象是个坏主意;您应该只使用小对象和将大部分脏衣物存储在堆中的对象。

在VS2012中,右键单击项目属性,然后选择代码分析并单击复选框以启用代码分析。跑步需要几分钟。