以下代码导致 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();

您将不会再看到该错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top