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

在VS(2005年)的调试器,我打破所有的',看看周围在呼叫一堆堆的线的misteriously消失的过程中,当我看到这个:

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

这肯定看起来像一个如此,这就能解释为什么该进程的运行,以其高兴的地方没有包装,其手提箱第一次。

问题是,VS调试器的呼叫堆仅显示你可以看到的图像。

所以我的问题是:我怎么能找到那里的无限递归呼吁开始?

我读 某个地方 在Linux可以附加一个回到"SIGSEGV"处理程序,并获得更多的信息在什么。

是否有任何类似于Windows?

有帮助吗?

解决方案

控制什么Windows不在的情况下访问冲突 (SIGSEGV-等),呼叫 SetErrorMode (通过它的参数0力弹出在错误的情况下,允许有把它与一个调试器。)

然而,基于堆叠的跟踪你已经得到的, 附有一个调试器故障时可能的产量没有额外的信息.无论是你的筹码已经被损坏,或递归的深度已超过最大数量的框架显示,通过比。在后一种情况下, 你可能想要 减少 默认堆尺寸的过程 (使用 /F 开关或相当的选项,在该项目的性质)为了使该问题表现得越早,并确保VS 显示所有的框架。你可以,或者,要坚持一个断点在std::basic_filebuf<>::flush()并步行通过它,直到的销毁阶段(或禁止它,直到之前销毁阶段。)

其他提示

那么,你知道什么线程问题是 - 它可能是通过它从开始跟踪,看看它熄灭到杂草一件简单的事情。

另一种选择是使用 Windows调试工具,调试器的一个包 - 它们可能能够显示出比VS调试器(可能)更,即使它们通常是更复杂且难以使用(实际上也许因为这一点)

这看起来像在一个无限递归乍一看,你可以尝试把一个断点在该行终止过程中的一个之前。是否那里好吗?如果是这样,你有两个相当简单的方法去。

无论你刚刚迈出第一步,看哪个析构函数被调用,当它被逮住了。或者你可以把一个printf / OutputDebugString的每一个相关对象的析构函数(唯一的这是全局应该需要这个)。如果消息是析构函数所做的第一件事,那么你看到的最后一条消息是从哪个挂东西的析构函数。

在另一方面,如果没有得到我最初所说,那么可以做类似的事情该断点,但它会更恼人的,因为该计划仍是“做的东西”。

我不排除有是在Windows这样的处理程序,但我从来没有听说过。

我认为你正在展示可能是伪造的回溯。如果你闯入后已经发生了某种腐败的过程,然后回溯不一定有效。不过,如果你是幸运的堆栈跟踪的底部还有什么回事一些线索。

尝试把Sleep()电话成可能参与递归在源选择的功能。这应该给你闯入前堆已经完全溢出的过程中更好的机会。

我同意丹勒斯劳。你的筹码是假的。可能仅仅是因为你没有正确的符号,虽然。 如果程序只是消失而不WER处理踢,它通常是内存不足的情况。您去调查这种可能性?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top