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を使用してスタックをクリーンアップし、ここに投稿してください。

または、すべての例外のトラップを有効にしてVisualStudioを使用することもできます。[デバッグ]、[例外]の順に移動し、すべてをトラップしていることを確認します。これは、デバッガーを混合モード(マネージドモードとアンマネージド)に切り替えるとともに行います。

スタックトレースを取得したら、答えを特定できます。

プロセスは、例外なく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** には代わりに 16 進数の値が必要です)。

ところで、リモートで管理されているクラッシュ プロセスに VS デバッガーを接続すると、最初に Visual Studio がハングし、応答しない devenv.exe を強制終了しているときにマシンで BSOD が発生します。素晴らしい!

于 2008-09-17T19:43:13.663 に答える
0

ここでは純粋な憶測ですが、問題は using ステートメントにある可能性があります。あなたのコードは次のようなものです(私は思う):

using (SoundPlayer myPlayer = new SoundPlayer(BEEPPURE))
{    
    myPlayer.Play();
}

using ブロックは myPlayer で Dispose() を呼び出しますが、サウンドの再生が完了する前に発生することがあります (ただし、サウンドが非常に短いため、サウンドが長い場合は毎回エラーを再現できると思います)。このエラーは、(SoundPlayer がラップする) Windows API が、.NET によって既に破棄されているバッファーを再生しようとした結果である可能性があります。

あなたがこれを行うと思います:

SoundPlayer myPlayer = new SoundPlayer(BEEPPURE);
myPlayer.Play();

あるいは

(new SoundPlayer(BEEPPURE)).Play();

エラーは表示されなくなります。

于 2008-10-02T17:20:22.020 に答える