SoundPlayer 在 Vista 上崩溃
-
01-07-2019 - |
题
以下代码导致 Vista 计算机上间歇性崩溃。
using (SoundPlayer myPlayer = new SoundPlayer(Properties.Resources.BEEPPURE))
myPlayer.Play();
我高度怀疑是这段代码,因为程序在蜂鸣声中间或每次播放蜂鸣声之前崩溃。我为所有人准备了顶级陷阱 ThreadExceptions
, UnhandledExceptions
在我的应用程序域中,以及 try-catch
大约 Application.Run
, ,都没有捕获这次崩溃。
有任何想法吗?
编辑:
事件查看器具有以下信息:
故障应用程序[XYZ] .EXE,版本4.0.0.0,时间戳0x48CE5A74,故障模块msvcrt.dll,版本7.0.6001.18000,时间戳记0x4791a727,异常代码0xc000055,decess 0xc0000005,故障offset Offset Offset Offset 0x00009b30,canspers ID 0x%,启动时间0x,启动时间0x, %10。
有趣的是, HRESULT 0xc0000005
有消息:
“阅读或写入无法访问的内存位置。” (status_access_violation)
解决方案
实际上,上面的代码(即new SoundPlayer(BEEPPURE)).Play();对我来说很崩溃。
本文解释了原因,并提供了一个可以完美运行的 SoundPlayer 替代方案:
http://www.codeproject.com/KB/audio-video/soundplayerbug.aspx?msg=2862832#xx2862832xx
其他提示
您可以使用 WinDBG 并捕获所有第一次机会异常。我相信你会看到一些有趣的东西。如果是这样,您可以使用 SOS 清理堆栈并将其发布到此处以帮助我们。
或者,您可以通过启用所有异常的陷阱来使用 Visual Studio。转到“调试”,然后转到“异常”,并确保捕获所有内容。执行此操作的同时将调试器切换到混合模式(托管和非托管)。
一旦获得堆栈跟踪,我们就可以确定答案。
Windows 上的进程不会无异常地退出。它就在那里。另外,您可能需要检查计算机的事件日志以查看是否显示了任何内容。
活动查看器显示HRESULT 0xC0000005“阅读或写入到无法访问的内存位置”。 (status_access_violation)
有关更多详细信息,请参阅上面我的编辑;重现此问题需要一段时间,因此我暂时无法获得 WinDBG 的新故障转储。
解决方案是使用 Microsoft.VisualBasic.Devices,它不会遇到此错误。由于它仅适用于 Vista,并且事件查看器甚至在记录崩溃的过程中失败了(进程 ID 0x**%9** 应该有一个十六进制值),我将责任归咎于 Vista 中的新声音代码。
顺便说一句,将 VS 调试器连接到远程管理的崩溃进程,首先会挂起 Visual Studio,然后在我的计算机上导致 BSOD,同时杀死无响应的 devenv.exe。精彩的!
这里纯粹是猜测,但问题可能出在 using 语句上。你的代码是这样的(我认为):
using (SoundPlayer myPlayer = new SoundPlayer(BEEPPURE))
{
myPlayer.Play();
}
using 块有时会在播放声音之前调用 myPlayer 上的 Dispose() (但很少见,因为声音太短 - 如果声音较长,我敢打赌您每次都能重现错误)。该错误可能是 Windows API(SoundPlayer 包装的)尝试播放已由 .NET 处理的缓冲区造成的。
我想如果你这样做:
SoundPlayer myPlayer = new SoundPlayer(BEEPPURE);
myPlayer.Play();
甚至
(new SoundPlayer(BEEPPURE)).Play();
您将不会再看到该错误。