2008-09-17 17 views
2

次のコードは、Vistaマシンで断続的なクラッシュを引き起こしています。VistaでSoundPlayerがクラッシュする

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

プログラムがミッドビープ音を鳴らすか、ビープ音が毎回再生される直前に、このコードが重大と思われます。私は、すべてのThreadExceptions、私のアプリケーションドメイン内にUnhandledExceptions、そしてtry-catchの周りにはApplication.Runのトップトラップを持っていますが、このクラッシュはありません。

アイデア?


EDIT:

イベントビューア、次の情報があります。

フォールティングアプリケーション[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

実際のクラッシュ情報を持っていると便利だろう。管理フレームと非管理フレームの両方を含むスタックトレースを提供してください(デバッガを管理モードと非管理モードに切り替えてください)。 –

+0

このクラッシュはデバッガーでは発生しません(カスタマーマシンのフィールドに表示されます)、例外トラップがトリガーされていないことに言及しました。このプロセスは単に終了します。 – Nick

+0

Nick、プロメムはVistaの健全なAPIと思われるので、connect.microsoft.com –

答えて

1

WinDBGを使用して、すべての最初の例外をトラップできます。面白いことがあると思うよ。もしそうなら、あなたはSOSを使ってスタックをクリーンアップし、私たちを助けるためにここに投稿することができます。

または、Visual Studioを使用すると、すべての例外のトラップを有効にすることができます。 "Debug"と "Exceptions"に行き、すべてをトラップするようにしてください。デバッガを混在モード(管理対象と非管理対象)に切り替えると同時にこれを実行します。

スタックトレースを取得したら、その答えを判断できます。

プロセスは例外なくWindows上で終了しません。それはそこにある。また、マシンのイベントログをチェックして、何かが表示されているかどうかを確認することもできます。

1

イベントビューアには、HRESULT 0xc0000005「アクセスできないメモリ位置への読み取りまたは書き込み」が表示されます。 (STATUS_ACCESS_VIOLATION)

詳細は上記の編集を参照してください。私はWinDBGのためのちょっとしたクラッシュダンプを少しも取れません。

0

解決方法は、このバグの影響を受けないMicrosoft.VisualBasic.Devicesを使用することです。それはVistaのみで、イベントビューアはクラッシュのロギングの途中で失敗することさえありました(プロセスID 0x **%9 **は16進値を代わりに持つはずです)、私はVistaの新しいサウンドコードに責任があると指摘します。

ところで、VSデバッガをクラッシュプロセスに接続すると、Visual Studioを最初にハングアップした後、私のマシンにBSODが発生し、非応答のdevenv.exeが強制終了します。素晴らしい!

0

ここで純粋な推測ですが、問題は使用するステートメントかもしれません。あなたのコードは(と思う)、このようなものです:

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

使用してブロックは時々、myPlayer上のDispose()を呼び出します音がとても短いので、それは、めったにサウンドを再生行われません(ただし、する前に - 長いと音、毎回エラーを再現できると思う)。このエラーは、.NETで既に破棄されているバッファを再生しようとするWindows API(SoundPlayerがラップする)の結果になります。

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

あるいは

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

あなたは、それ以上のエラーが表示されません。

私はあなたがこれを行う場合を考えます。

+0

でこの問題をマイクロソフトに知らせてくださいね。使用しているブロックであってもエラーを再現することはできません。 – MusiGenesis

関連する問題