2008-09-17 16 views
2

Der folgende Code verursacht einen zeitweiligen Absturz auf einem Vista-Computer.SoundPlayer stürzt unter Vista ab

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

ich sehr vermutet, dass es dieser Code ist, weil das Programm Mitte Piepton abstürzt oder kurz vor dem Signalton jedes Mal gespielt wird. Ich habe Top-Level-Traps für alle ThreadExceptions, UnhandledExceptions in meiner App-Domäne, und eine try-catch um Application.Run, von denen keine dieser Absturz.

Irgendwelche Ideen?


EDIT:

Die Ereignisanzeige hat folgende Informationen:

Fehlgeschlagene Anwendung [xyz] .exe, Version 4.0.0.0, Zeitstempel 0x48ce5a74, fehlgeschlagenes Modul msvcrt.dll , Version 7.0.6001.18000, Uhrzeit Stempel 0x4791a727, Ausnahmecode 0xc0000005, Fehlerversatz 0x00009b30, Prozess-ID 0x% 9, Anwendungsstartzeit 0x% 10.

Interessanterweise hat die HRESULT 0xc0000005 die Meldung: "Lesen oder zu einem unzugänglichen Speicherplatz zu schreiben"

(STATUS_ACCESS_VIOLATION)

+0

Es wäre hilfreich. Stellen Sie eine Stack-Ablaufverfolgung bereit, die sowohl verwaltete als auch nicht verwaltete Frames enthält (wechseln Sie den Debugger in den verwalteten und nicht verwalteten Modus). –

+0

Dieser Absturz tritt im Debugger nicht auf (er wird im Feld auf einer Kundenmaschine beobachtet). Wie ich bereits erwähnt habe, werden keine der Ausnahme-Traps ausgelöst. Der Prozess wird einfach beendet. – Nick

+0

Nick, da das Prelem Vistas Sound-APIs zu sein scheint, bitte benachrichtigen Sie Microsoft dieses Problem bei connect.microsoft.com –

Antwort

1

Sie können WinDBG verwenden und alle Ausnahmen der ersten Chance abfangen. Ich bin sicher, du wirst etwas Interessantes sehen. Wenn ja, kannst du SOS benutzen, um den Stapel aufzuräumen und ihn hier zu posten, um uns weiter zu helfen.

Oder Sie können Visual Studio verwenden, indem Sie den Trap aller Ausnahmen aktivieren. Gehen Sie zu "Debuggen" und dann "Ausnahmen" und stellen Sie sicher, dass Sie alles abfangen. Tun Sie dies zusammen mit dem Wechsel des Debuggers in den gemischten Modus (verwaltet und nicht verwaltet).

Sobald Sie den Stack-Trace haben, können wir die Antwort bestimmen.

Ein Prozess wird unter Windows nicht ohne eine Ausnahme beendet. Es ist da drin. Möglicherweise möchten Sie auch das Ereignisprotokoll des Geräts überprüfen, um festzustellen, ob etwas angezeigt wurde.

1

Die Ereignisanzeige zeigt HRESULT 0xc0000005 "Lesen oder Schreiben an einen nicht zugreifbaren Speicherort." (STATUS_ACCESS_VIOLATION)

Siehe meine Bearbeitung oben für weitere Details; Das zu wiederholen, dauert eine Weile, so dass ich für WinDBG für eine kurze Zeit keinen neuen Absturzspeicher erhalten kann.

0

Die Lösung besteht darin, Microsoft.VisualBasic.Devices zu verwenden, die nicht von diesem Fehler betroffen ist. Da es nur Vista ist und die Ereignisanzeige sogar mitten in der Protokollierung des Absturzes fehlschlug (Prozess-ID 0x **% 9 ** sollte stattdessen einen hexadezimalen Wert haben), weise ich auf den neuen Sound-Code in Vista hin.

BTW, verbindet den VS-Debugger mit dem Absturz-Prozess remote verwaltet, zuerst Visual Studio hängen, dann eine BSOD auf meinem Computer verursachen, während die nicht reagierende devenv.exe zu töten. Wunderbar!

0

Reine Spekulation hier, aber das Problem kann die using-Anweisung sein.Der Code ist wie folgt (glaube ich):

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

Die Verwendung von Block Dispose() auf MyPlayer nennen, manchmal, bevor es getan spielt den Sound (aber selten, weil der Ton so kurz ist - mit einem längeren Sound, ich wette, Sie können den Fehler jedes Mal reproduzieren). Der Fehler wäre das Ergebnis der Windows-API (die SoundPlayer umschließt), die versucht, einen Puffer wiederzugeben, der bereits von .NET entsorgt wurde.

Ich denke, wenn Sie dies tun:

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

oder sogar

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

Sie werden nicht den Fehler nicht mehr sehen.

+0

Ich denke nicht. Ich kann den Fehler nicht reproduzieren, auch nicht mit einem Verwendungsblock. – MusiGenesis