这是一个相当复杂的错误,我已经尝试过寻找其他帮助来源,但由于我不明白的原因,“Vista中的程序崩溃”并不是最有用的查询。
我遇到的问题是我正在研究的程序 - 一个使用OpenGL和Windows API的图形化多线程数据可视化软件 - 在WinMain()返回后崩溃。我已经尝试逐步执行关闭例程以及查看堆栈跟踪,而不是汇编的最后一段代码是_crtExitProcess,它在实际的ExitProcess(0)调用中崩溃。之后,堆栈跟踪显示了kernel32.dll和四个ntdll.dll,这是它实际崩溃的地方。
此错误仅发生在Vista上,并且在XP上运行时相同的确切代码正常退出。我真的想不出任何可以帮助我调试这个问题的东西,调试这个问题是我从未真正学过的东西。任何帮助将不胜感激。
答案 0 :(得分:5)
我已经做了一些挖掘,我发现了几个帖子,表明你不是唯一一个受此影响的人:
特别是,第二个是有趣的,Tom Chm提到:
我们相信我们已经确定了根 我们崩溃的原因,并添加一个 虚拟析构函数到我们的界面 class wrapper好像解决了我们的问题 问题。但我们想知道 确认崩溃的确切原因 我们不只是扫了实际 地毯下的问题。
问题可能出在某个地方的析构函数,或缺乏。如果您有一种附加调试器并逐步完成关闭过程的方法,那么它可能会有所帮助。
您可能想要阅读整个帖子并查看是否有可以学习的内容。也就是说,如果您在搜索中尚未找到这些帖子,那么。
答案 1 :(得分:3)
听起来有点像析构函数的问题。
检查在关机时销毁的对象。这主要是全局或静态对象。仔细查看他们的析构函数,以获取访问不再有效的内容的情况。在多线程环境中,它可能是竞争条件,其中一个对象被销毁而另一个线程仍在使用它。
尝试在销毁对象时编写日志。 e.g。
SomeClass::~SomeClass()
{
WriteLog("Begin ~SomeClass()");
// do whatever
WriteLog("End ~SomeClass()");
}
WriteLog()应该打开日志文件,写入然后关闭文件以确保文件被刷新。使用Mutex或CriticalSection来避免冲突是一个好主意。
在崩溃后查看日志可能会为您提供有关正在发生的事情的线索。