退出后调试崩溃? (主要归还后)

时间:2009-01-16 14:42:26

标签: c++ multithreading debugging visual-c++ windows-vista

这是一个相当复杂的错误,我已经尝试过寻找其他帮助来源,但由于我不明白的原因,“Vista中的程序崩溃”并不是最有用的查询。

我遇到的问题是我正在研究的程序 - 一个使用OpenGL和Windows API的图形化多线程数据可视化软件 - 在WinMain()返回后崩溃。我已经尝试逐步执行关闭例程以及查看堆栈跟踪,而不是汇编的最后一段代码是_crtExitProcess,它在实际的ExitProcess(0)调用中崩溃。之后,堆栈跟踪显示了kernel32.dll和四个ntdll.dll,这是它实际崩溃的地方。

此错误仅发生在Vista上,并且在XP上运行时相同的确切代码正常退出。我真的想不出任何可以帮助我调试这个问题的东西,调试这个问题是我从未真正学过的东西。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:5)

我已经做了一些挖掘,我发现了几个帖子,表明你不是唯一一个受此影响的人:

特别是,第二个是有趣的,Tom Chm提到:

  

我们相信我们已经确定了根   我们崩溃的原因,并添加一个   虚拟析构函数到我们的界面   class wrapper好像解决了我们的问题   问题。但我们想知道   确认崩溃的确切原因   我们不只是扫了实际   地毯下的问题。

问题可能出在某个地方的析构函数,或缺乏。如果您有一种附加调试器并逐步完成关闭过程的方法,那么它可能会有所帮助。

您可能想要阅读整个帖子并查看是否有可以学习的内容。也就是说,如果您在搜索中尚未找到这些帖子,那么。

答案 1 :(得分:3)

听起来有点像析构函数的问题。

检查在关机时销毁的对象。这主要是全局或静态对象。仔细查看他们的析构函数,以获取访问不再有效的内容的情况。在多线程环境中,它可能是竞争条件,其中一个对象被销毁而另一个线程仍在使用它。

尝试在销毁对象时编写日志。 e.g。

SomeClass::~SomeClass()
{
    WriteLog("Begin ~SomeClass()");
    // do whatever
    WriteLog("End ~SomeClass()");
}

WriteLog()应该打开日志文件,写入然后关闭文件以确保文件被刷新。使用Mutex或CriticalSection来避免冲突是一个好主意。

在崩溃后查看日志可能会为您提供有关正在发生的事情的线索。