2

以下代码导致 Vista 机器上的间歇性崩溃。

using (SoundPlayer myPlayer = new SoundPlayer(Properties.Resources.BEEPPURE))
     myPlayer.Play();

我高度怀疑是这段代码,因为程序在哔哔声中或每次播放哔哔声之前崩溃。我的应用程序域中的 all 和ThreadExceptionsaround都有顶级陷阱,但没有一个会导致此崩溃。UnhandledExceptionstry-catchApplication.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)

4

5 回答 5

3

其实上面的代码(也就是 new SoundPlayer(BEEPPURE)).Play(); 对我来说是崩溃的。

本文解释了原因,并提供了一个可以完美运行的 SoundPlayer 替代方案:

http://www.codeproject.com/KB/audio-video/soundplayerbug.aspx?msg=2862832#xx2862832xx

于 2009-01-02T01:10:03.557 回答
1

您可以使用 WinDBG 并捕获所有第一次机会异常。我相信你会看到一些有趣的东西。如果是这样,您可以使用 SOS 清理堆栈并将其发布在此处以帮助我们。

或者,您可以通过启用所有异常的陷阱来使用 Visual Studio。转到“调试”,然后转到“异常”,确保捕获所有内容。在将调试器切换到混合模式(托管和非托管)的同时执行此操作。

一旦你有了堆栈跟踪,我们就可以确定答案。

进程不会在 Windows 上无异常退出。它在里面。此外,您可能需要检查机器的事件日志以查看是否有任何显示。

于 2008-09-17T13:03:07.260 回答
1

事件查看器显示 HRESULT 0xc0000005“正在读取或写入不可访问的内存位置”。(STATUS_ACCESS_VIOLATION)

有关更多详细信息,请参阅我上面的编辑;重现这需要一段时间,所以我暂时无法获得 WinDBG 的新故障转储。

于 2008-09-17T13:50:52.607 回答
0

解决方案是使用不受此错误影响的 Microsoft.VisualBasic.Devices。由于它只是 Vista,而且事件查看器甚至在记录崩溃的过程中失败(进程 id 0x**%9** 应该有一个十六进制值),我将责任归咎于 Vista 中的新声音代码。

顺便说一句,将 VS 调试器远程连接到崩溃进程,首先挂起 Visual Studio,然后在我的机器上导致蓝屏死机,同时杀死无响应的 devenv.exe。精彩的!

于 2008-09-17T19:43:13.663 回答
0

这里纯属猜测,但问题可能出在 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();

您将不会再看到该错误。

于 2008-10-02T17:20:22.020 回答