以下代码导致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,异常代码0xc0000005,故障偏移0x00009b30, 进程ID为0x%9,应用程序启动时间为0x%10。
有趣的是,HRESULT 0xc0000005
有消息:
“读取或写入无法访问的内存位置。” (STATUS_ACCESS_VIOLATION)
答案 0 :(得分:3)
实际上,上面的代码(即新的SoundPlayer(BEEPPURE))。Play();为我而崩溃。
本文解释了原因,并提供了一个完美无缺的SoundPlayer替代方案:
http://www.codeproject.com/KB/audio-video/soundplayerbug.aspx?msg=2862832#xx2862832xx
答案 1 :(得分:1)
您可以使用WinDBG并捕获所有第一次机会异常。我相信你会看到一些有趣的东西。如果是这样,您可以使用SOS清理堆栈并将其发布到此处以帮助我们。
或者您可以通过启用所有异常的陷阱来使用Visual Studio。转到“Debug”然后“Exceptions”并确保捕获所有内容。执行此操作以及将调试器切换到混合模式(托管和非托管)。
一旦你有了堆栈跟踪,我们就可以确定答案了。
在没有例外的情况下,进程不会在Windows上退出。它在那里。此外,您可能需要检查机器的事件日志以查看是否有任何显示。
答案 2 :(得分:1)
事件查看器显示HRESULT 0xc0000005“读取或写入无法访问的内存位置”。 (STATUS_ACCESS_VIOLATION)
有关详细信息,请参阅上面的编辑;责备这需要一段时间,所以我不能在一段时间内为WinDBG获得新的崩溃转储。
答案 3 :(得分:0)
解决方案是使用Microsoft.VisualBasic.Devices,它不会遇到此错误。因为它只是Vista,并且事件查看器甚至在记录崩溃的过程中失败了(进程id ** **%9 **应该有一个十六进制值),我指责Vista中的新声音代码。 / p> 顺便说一句,将VS调试器连接到远程管理的崩溃进程首先挂起Visual Studio,然后在我的机器上导致BSOD,同时杀死无响应的devenv.exe。精彩!
答案 4 :(得分:0)
这里纯粹猜测,但问题可能是使用声明。你的代码是这样的(我认为):
using (SoundPlayer myPlayer = new SoundPlayer(BEEPPURE))
{
myPlayer.Play();
}
使用块会在myPlayer上调用Dispose(),有时在播放声音之前(但很少,因为声音很短 - 声音较长,我敢打赌你每次都可以重现错误) 。该错误将是Windows API(SoundPlayer包装)尝试播放已由.NET处理的缓冲区的结果。
我想如果你这样做:
SoundPlayer myPlayer = new SoundPlayer(BEEPPURE);
myPlayer.Play();
甚至
(new SoundPlayer(BEEPPURE)).Play();
你不会再看到错误了。