Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在VisualStudio中监视调用堆栈大小_C++_Visual Studio 2008_Monitoring_Stack Overflow_Callstack - Fatal编程技术网

C++ 在VisualStudio中监视调用堆栈大小

C++ 在VisualStudio中监视调用堆栈大小,c++,visual-studio-2008,monitoring,stack-overflow,callstack,C++,Visual Studio 2008,Monitoring,Stack Overflow,Callstack,在VisualStudio中是否有监视调用堆栈大小的方法?在运行时提供调用堆栈窗口,但不显示堆栈的大小。我使用C++,并面临堆栈溢出问题。我知道我正在使用的一些递归函数可能有问题,但在解决这些问题之前,我希望监视调用堆栈大小,看看发生了什么。有几种方法: 在手表窗口中检查ESP。您可以通过在“监视”窗口中监视@esp来执行此操作。将此与ESP在流程开始时的情况进行比较 类似地,检查第一个/最后一个堆栈帧中堆栈分配变量的地址 请注意,堆栈通常是向后分配的,因此随着堆栈的增长,ESP变得越来越小。在

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

有几种方法:

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

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

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

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


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

    注意,对于Windows,这似乎不起作用(请参阅:)@esp-250000它是否总是保证消耗四分之一的可用堆栈空间?。我的意思是我的设置可能有不同的堆栈大小。那么,同样的工作在我这边也会起作用吗?。在64位机器上,寄存器称为
    rsp