首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >windows中的调试堆栈溢出?

windows中的调试堆栈溢出?
EN

Stack Overflow用户
提问于 2009-04-02 13:50:12
回答 5查看 2.9K关注 0票数 5

所以我正在尝试调试这个奇怪的问题,在这个问题中,进程在没有调用析构函数的情况下结束...

在VS (2005)调试器中,我点击了'Break all‘,并查看了misteriously进程的线程的调用堆栈,当我看到以下内容时:

smells like SO http://img6.imageshack.us/img6/7628/95434880.jpg

这看起来肯定像是一个正在形成的SO,这将解释为什么这个过程在没有事先打包行李箱的情况下就会运行到它的快乐之地。

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

所以我的问题是:我如何才能找到无限递归调用的起点?

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

Windows上有没有类似的东西?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-04-02 15:42:23

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

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

票数 3
EN

Stack Overflow用户

发布于 2009-04-02 16:02:58

好吧,你知道问题在哪条主线上--这可能是一个简单的问题,从一开始就追踪它,看看它在哪里深入到杂草中。

另一种选择是使用Debugging Tools for Windows包中的调试器之一-它们可能比VS调试器显示更多(可能),即使它们通常更复杂和难以使用(实际上可能正因为如此)。

票数 3
EN

Stack Overflow用户

发布于 2009-04-02 14:33:45

乍一看,这确实像是无限递归,您可以尝试在终止进程的行前放置一个断点。它能到那里吗?如果是这样的话,您有两种相当容易的方法。

要么你只是向前一步,看看调用了哪些析构函数,什么时候它被捕获了。或者你可以在每个相关的对象析构函数中放一个printf/OutputDebugString (全局的ONly应该需要这个)。如果消息是析构函数做的第一件事,那么你看到的最后一条消息是来自析构函数,它会挂起东西。

另一方面,如果它没有到达我最初提到的那个断点,那么可以做一些类似的事情,但它会更烦人,因为程序仍然在“做事情”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/709795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档