在Windows中调试堆栈溢出?

Cri*_*scu 5 c++ windows stack-overflow debugging

所以我试图调试这个奇怪的问题,其中一个进程结束而不调用一些析构函数...

在VS(2005)调试器中,当我看到这个时,我点击'Break all'并在大量消失的进程的线程的调用堆栈中查看:

闻起来像SO http://img6.imageshack.us/img6/7628/95434880.jpg

这绝对看起来像一个正在制作中的SO,这可以解释为什么这个过程运行到它的快乐的地方,而不首先包装它的行李箱.

问题是,VS调试器的调用堆栈只显示您在图像中可以看到的内容.

所以我的问题是:如何找到无限递归调用的起始位置?

我在某处读到,在Linux中你可以附加一个回调到SIGSEGV处理程序,并获得有关正在发生的事情的更多信息.

Windows上有类似的东西吗?

vla*_*adr 3

要控制 Windows 在发生访问冲突时执行的操作SIGSEGV-等效),请调用 SetErrorMode(传递参数 0 以在出现错误时强制弹出窗口,从而允许您使用调试器附加到它。)

但是,根据您已经获得的堆栈跟踪,在错误时附加调试器可能不会产生任何其他信息。要么你的堆栈已损坏,要么递归深度超过了 VS 可显示的最大帧数。在后一种情况下,您可能需要减小进程的默认堆栈大小(使用/F项目属性中的开关或等效选项)以使问题更快地显现出来,并确保 VS显示所有帧。或者,您可能想在 std::basic_filebuf<>::flush() 中设置一个断点,并遍历它直到销毁阶段(或在销毁阶段之前禁用它。)