Wie sollten Sie den Fehler diagnostizieren? SEHException - Externe Komponente hat eine Ausnahme ausgelöst

85

Immer wenn ein Benutzer einen Fehler meldet, wie z

System.Runtime.InteropServices.SEHException - Externe Komponente hat eine Ausnahme ausgelöst?

Kann ich als Programmierer etwas tun, um die Ursache zu ermitteln?

Szenario: Ein Benutzer (mit einem von meiner Firma geschriebenen Programm) hat diesen Fehler gemeldet. Dies kann ein einmaliger Fehler gewesen sein oder nicht. Sie erwähnten, dass der Computer im letzten Monat zweimal "aufgehört hat zu arbeiten". Ich habe aus Erfahrung gelernt, diese Beschreibung nicht zu wörtlich zu nehmen, da dies normalerweise bedeutet, dass jemand, der sich auf den Computer bezieht, nicht wie erwartet arbeitet. Sie konnten mir keine weiteren Details geben und ich konnte keine protokollierten Fehler finden. Daher kann es dieser Fehler gewesen sein oder nicht.

Aus der Stapelverfolgung ergab sich der eigentliche Fehler beim Erstellen einer Klasse, die keinen Interop-Code direkt aufruft, aber möglicherweise durch die Tatsache erschwert wird, dass das Objekt Teil einer Liste sein kann, die an ein DevExpress-Raster gebunden ist.

Der Fehler wurde von einer nicht behandelten Ausnahmeroutine "abgefangen", die normalerweise das Programm schließt, aber die Option hat, sie zu ignorieren und fortzusetzen. Wenn sie sich entschieden haben, den Fehler zu ignorieren, arbeitete das Programm weiter, aber der Fehler trat erneut auf, als diese Routine das nächste Mal ausgeführt wurde. Es ist jedoch nach dem Schließen und Neustarten unserer Anwendung nicht erneut aufgetreten.

Der betreffende Computer schien nicht gestresst zu sein. Es läuft unter Vista Business, hat 2 GB Arbeitsspeicher und laut Task Manager nur etwa die Hälfte davon mit unserer Anwendung nur etwa 200 MB verwendet.

Es gibt noch eine weitere Information, die relevant sein kann oder nicht. In einem anderen Abschnitt desselben Programms wird eine Komponente eines Drittanbieters verwendet, bei der es sich effektiv um einen Dotnet-Wrapper um eine native DLL handelt. Diese Komponente weist ein bekanntes Problem auf, bei dem gelegentlich eine

Es wurde versucht, geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass der andere Speicher beschädigt ist

Die Komponentenhersteller sagen, dass dies in der neuesten Version ihrer Komponente behoben wurde, die wir intern verwenden, aber dies wurde dem Kunden noch nicht mitgeteilt.

Angesichts der Tatsache, dass die Folgen des Fehlers gering sind (es geht keine Arbeit verloren und das Neustarten des Programms dauert es höchstens eine Minute, bis sie wieder dort sind, wo sie waren) und dass der Kunde in Kürze eine neue Version erhält (mit der aktualisierten dritten Version). Party-Komponente), ich kann natürlich die Daumen drücken und hoffe, dass der Fehler nicht wieder auftritt.

Aber kann ich noch etwas tun?

sgmoore
quelle

Antworten:

28

Ja. Dieser Fehler ist eine strukturierte Ausnahme, die keinem .NET-Fehler zugeordnet wurde. Es ist wahrscheinlich, dass Ihre DataGrid-Zuordnung eine native Ausnahme auslöst, die nicht erfasst wurde.

Anhand der ExternalException.ErrorCode- Eigenschaft können Sie erkennen, welche Ausnahme auftritt . Ich würde Ihre Stapelverfolgung überprüfen und, wenn sie mit dem DevExpress-Raster verknüpft ist, das Problem ihnen melden.

Reed Copsey
quelle
1
StackTrace erwähnte DevExpress nirgendwo, sondern nur in meiner Klasse. Muss überprüfen, um zu sehen, was der ErrorCode war.
sgmoore
Versuchen Sie in diesem Fall herauszufinden, was genau die Fehlermeldung ausgelöst hat.
Reed Copsey
4
"Schauen Sie sich die ExternalException.ErrorCode-Eigenschaft an" - haben Sie Hinweise, wie genau das zu tun ist? VS zeigt mir "Eine nicht behandelte Ausnahme vom Typ 'System.Runtime.InteropServices.SEHException' ist in .... dll aufgetreten um "Details" des Ausnahmeobjekts an einer beliebigen Stelle anzuzeigen.
ODER Mapper
8

Ich hatte ein ähnliches Problem mit einer SEHException, die ausgelöst wurde, als mein Programm zum ersten Mal einen nativen DLL-Wrapper verwendete. Es stellte sich heraus, dass die native DLL für diesen Wrapper fehlte. Die Ausnahme war in keiner Weise hilfreich, um dies zu lösen. Am Ende hat es geholfen, procmon im Hintergrund auszuführen und zu überprüfen, ob beim Laden aller erforderlichen DLLs Fehler aufgetreten sind.

Maurice Gilden
quelle
3

Die Komponentenhersteller sagen, dass dies in der neuesten Version ihrer Komponente behoben wurde, die wir intern verwenden, aber dies wurde dem Kunden noch gegeben.

Fragen Sie den Komponentenhersteller, wie er testen kann, ob das Problem, das der Kunde erhält, das Problem ist, das er in seiner neuesten Version behoben hat, ohne / bevor er die neueste Version für den Kunden bereitstellt.

ChrisW
quelle
1

Ich bin auf diesen Fehler gestoßen, wenn sich die App auf einer Netzwerkfreigabe befindet und das Gerät (Laptop, Tablet, ...) während der Verwendung der App vom Netzwerk getrennt wird. In meinem Fall lag es an einem Surface-Tablet, das sich außerhalb der Funkreichweite befand. Keine Probleme nach der Installation eines besseren WAP.

Conrad
quelle
1
Ich habe es zufällig erhalten, als ich auf verschiedene Arten von Reflektionen (GetAssemblyName, GetProperty, Activator usw.) sowohl in meinen Code- als auch in Bibliotheken von Drittanbietern und nur in einer Kundenumgebung zugegriffen habe, ähnlich wie bei Bibliotheken am Remotestandort. Viele Beweise dafür, dass es sich um einen .net-Framework-Fehler handelt.
Andriy K
Andriy K: Ich glaube nicht, dass dies ein .NET-Problem ist. Ich denke, dass Handles für geöffnete Dateien auf der Netzwerkfreigabe verloren gehen oder irgendwie gelöscht werden, möglicherweise ein Fehler in Windows oder ein Netzwerkproblem. Baugruppen sind speicherabgebildet und werden bei Bedarf von der Festplatte ausgelagert (Zeitbombe). Möglicherweise kann der Speicher auch in Situationen mit geringem Arbeitsspeicher verworfen werden. Wenn die geöffneten Dateihandles nicht stabil sind, explodiert dies wahrscheinlich in Rauch. .NET hätte es vielleicht handhaben und die Datei erneut öffnen können (das Problem glätten), aber es könnte kompliziert sein.
Osexpert
Ich habe das gleiche Problem. Ich erhalte System.Runtime.InteropServices.SEHException (0x80004005) ohne Stack-Trace. Dies ist die InnerException einer TargetInvocationException. Die TargetInvocationException hat zwar eine Stapelverfolgung, aber für mich ergab dies keinen Sinn, da sie von main oder Application.Run zu stammen schien. Es passiert sehr zufällig, meistens abends. Ich denke, die einzige "Lösung" besteht darin, nicht vom Netzlaufwerk aus zu laufen: - | Vielleicht füge ich einen Scheck hinzu, der dieses Szenario blockieren kann: stackoverflow.com/questions/8633680/…
osexpert
0

Nur eine weitere Information ... Hatte dieses Problem heute auf einem Windows 2012 R2 x64 TS-System, auf dem die Anwendung von einem unc / Netzwerkpfad aus gestartet wurde. Das Problem trat bei einer Anwendung für alle Terminalserverbenutzer auf. Die lokale Ausführung der Anwendung funktionierte problemlos. Nach einem Neustart funktionierte es wieder - die ausgelöste SEHException war Constructor init und TargetInvocationException


quelle
0

Meine Maschinenkonfigurationen:

Betriebssystem: Windows 10 Version 1703 (x64)

Beim Debuggen meines C # .Net-Projekts in der Visual Studio 2017 Community Edition ist dieser Fehler aufgetreten. Ich habe eine native Methode aufgerufen, indem ich p / invoke für eine zur Laufzeit geladene C ++ - Assembly ausgeführt habe. Ich habe den gleichen Fehler festgestellt, der von OP gemeldet wurde.

Ich habe festgestellt, dass Visual Studio mit einem Benutzerkonto gestartet wurde, das kein Administrator auf dem Computer war. Dann habe ich Visual Studio unter einem anderen Benutzerkonto neu gestartet, das ein Administrator auf dem Computer war. Das ist alles. Mein Problem wurde gelöst und ich habe mich dem Problem nicht mehr gestellt.

Eine Sache zu beachten ist, dass die Methode, die auf C ++ Assembly aufgerufen wurde, einige Dinge in die Registrierung schreiben sollte. Ich habe den C ++ - Code nicht debuggt, um RCA auszuführen, aber ich sehe die Möglichkeit, dass das Ganze fehlgeschlagen ist, da zum Schreiben der Registrierung unter Windows 10 Administratorrechte erforderlich sind. Als Visual Studio früher unter einem Benutzerkonto ausgeführt wurde, das keine Administratorrechte auf dem Computer hatte, schlugen die nativen Aufrufe fehl.

RBT
quelle
0

Ich habe diesen Fehler beim Ausführen von Unit-Tests für das von mir eingerichtete Speicher-Caching erhalten. Es überflutete den Cache. Nach dem Ungültigmachen des Caches und dem Neustart der VM funktionierte dies einwandfrei.

atreyHazelHispanic
quelle