【问题标题】:Debugging a crash after exiting? (After main returned)退出后调试崩溃? (主要返回后)
【发布时间】:2009-01-16 14:42:26
【问题描述】:

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

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

这个bug只出现在Vista上,同样的代码在XP上运行正常退出。我真的想不出任何可以帮助我调试这个问题的东西,而调试这个问题是我从未真正学到的东西。任何帮助将不胜感激。

【问题讨论】:

  • 你得到的异常到底是什么?
  • 0xC0000005 - 访问冲突。
  • 您是否设法在 purify 之类的内存调试器下运行它?对我来说似乎是一个记忆问题......

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


【解决方案1】:

我已经做了一些挖掘,我发现了一些帖子表明你不是唯一一个遭受这种情况的人:

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

我们相信我们已经确定了根源 我们崩溃的原因,并添加了一个 我们接口的虚拟析构函数 类包装器似乎解决了我们的 问题。但我们想知道 确认崩溃的确切原因 我们不只是扫了实际 隐藏的问题。

问题可能出在某处的析构函数上,或缺少析构函数。如果您有办法附加调试器并逐步完成关闭过程,它可能会有所帮助。

您可能想通读整个帖子,看看是否有什么可以学习的。也就是说,当然,如果您还没有在搜索中找到这些帖子。

【讨论】:

  • support.microsoft.com/kb/941833 这似乎很相关,谢谢!我们无法在这台计算机上运行更新,因为它是针对客户端的,但这可以是我们可以告诉他们做的事情。该错误看起来与我们所拥有的相同。
  • 希望您可以相对轻松地对所有问题进行排序 - 这种错误是最难弄清楚的。
  • 程序怎么会因为缺少析构函数而崩溃?它不会只是泄漏内存吗?
【解决方案2】:

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

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

尝试在对象被销毁时写入日志。例如

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

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

在崩溃后查看日志可能会给您一些关于发生了什么的线索。

【讨论】:

  • 如果这是我们的析构函数之一,它不会出现在堆栈跟踪中吗?另外,Vista 和 XP 有什么区别呢?
  • 析构函数是 C++ 特有的。它们将从 C++ 运行时调用。
猜你喜欢
  • 2023-03-22
  • 2012-01-16
  • 1970-01-01
  • 2019-11-14
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多