内存转储分析(应用程序挂起)

Phi*_*all 3 c++ windows debugging directsound freeze

我正在尝试分析在应用程序发生挂起后从一位最终用户那里收到的内存转储。它似乎与我的应用程序的音频播放部分有关。我相信涉及两个线程,即将开始播放声音的主线程和一个更新器线程,它迭代链接列表中的声音以不断更新它们的状态。然而,我不明白挂起的根源是什么。

我的 WinDbg 知识有限,但我设法发现挂起似乎发生在音频库的 SetLoop 方法内部(特别是在静态声音代码中)。我使用 DirectSound,在本例中应用程序在 Windows 7 32 位上运行(我自己在 XP 上进行开发,从未遇到过这样的问题)。静态声音类在检查声音是否正在播放之前锁定关键部分,如果没有,则将循环标志设置为 true 或 false。在本例中,主线程正在调用 SetLoop 将其设置为 false,因为它希望以非循环状态播放声音。我可以看到,在挂起时,主线程陷入了对 ntdll.dll 中 EtwEventEnabled 的调用中,这显然是由静态声音类的 SetLoop 方法进行的。我想知道它是否卡在 EnterCriticalSection 调用中,或者当它调用 DirectSound 的辅助缓冲区的 GetStatus 方法时卡在更靠下的某个地方?这就是我对内存转储分析的了解不足的地方,如果有人愿意花时间查看转储,我将非常感激。

以下是转储的链接,其中包含应用程序特定的符号: https: //dl.dropbox.com/u/5121962/hangdump.zip

预先非常感谢您的帮助。

Rog*_*and 5

您可以尝试使用 Microsoft 的调试诊断工具分析转储- 它似乎证实了您的怀疑,但如果您不了解 exe 的代码或发布构建 PDB,我无法从调用堆栈中获取更多信息。

从报告中(您可以使用该工具自己运行完整的分析)涉及两个线程 - 摘要如下:

问题总结

线程0和4的调用栈如下:

线程 0

.. 和 ...

线程 4

这些可能会为您提供更多信息,让您再次行动......

希望有帮助,

罗杰