94 votes

Comment diagnostiquer l'erreur "SEHException - External component has thrown an exception" ?

Lorsqu'un utilisateur signale une erreur telle que

System.Runtime.InteropServices.SEHException - Un composant externe a déclenché une exception ?

Y a-t-il quelque chose que je puisse faire, en tant que programmeur, pour déterminer la cause ?

Scénario : Un utilisateur (utilisant un programme écrit par ma société) a signalé cette erreur. Il peut s'agir ou non d'une erreur ponctuelle. Il a mentionné qu'au cours du mois dernier, l'ordinateur s'est "arrêté de fonctionner" à deux reprises. L'expérience m'a appris qu'il ne faut pas prendre cette description trop au pied de la lettre, car elle signifie généralement qu'un élément lié à l'ordinateur ne fonctionne pas comme prévu. Ils n'ont pas été en mesure de me donner plus de détails et je n'ai pu trouver aucune erreur enregistrée. Il peut donc s'agir ou non de cette erreur.

D'après la trace de la pile, l'erreur réelle est survenue lors de la construction d'une classe qui n'appelle pas directement un code interop, mais qui est peut-être compliquée par le fait que l'objet peut faire partie d'une liste liée à une grille DevExpress.

L'erreur a été "attrapée" par une routine d'exception non gérée qui, normalement, ferme le programme, mais qui a la possibilité de l'ignorer et de continuer. S'ils ont choisi d'ignorer l'erreur, le programme a continué à fonctionner mais l'erreur s'est reproduite lors de la prochaine exécution de cette routine. Cependant, elle ne s'est pas reproduite après la fermeture et le redémarrage de notre application.

L'ordinateur en question ne semblait pas être stressé. Il fonctionne sous Vista Business, dispose de 2 Go de mémoire et, selon le Gestionnaire des tâches, il n'en utilisait que la moitié, notre application ne pesant que 200 Mo environ.

Il y a un autre élément d'information qui peut ou non être pertinent. Une autre section du même programme utilise un composant tiers qui est en fait une enveloppe Dotnet autour d'une dll native et ce composant a un problème connu où, très occasionnellement, vous obtenez un message d'erreur de type

Tentative de lecture ou d'écriture d'une mémoire protégée. C'est souvent une indication que d'autres mémoires sont corrompues.

Les fabricants de composants affirment que ce problème a été corrigé dans la dernière version de leur composant que nous utilisons en interne, mais il n'a pas encore été communiqué au client.

Étant donné que les conséquences de l'erreur sont faibles (aucun travail n'est perdu et le redémarrage du programme et le retour à la situation initiale ne prennent qu'une minute au maximum) et que le client recevra bientôt une nouvelle version (avec le composant tiers mis à jour), je peux évidemment croiser les doigts et espérer que l'erreur ne se reproduira pas.

Mais est-ce que je peux faire quelque chose de plus ?

30voto

Reed Copsey Points 315315

Oui. Cette erreur est une exception structurée qui n'a pas été convertie en une erreur .NET. Il s'agit probablement de votre mappage DataGrid qui lance une exception native qui n'a pas été attrapée.

Vous pouvez savoir quelle est l'exception qui se produit en regardant le fichier ExternalException.ErrorCode propriété. Je vérifierais votre trace de pile, et si c'est lié à la grille DevExpress, rapportez-leur le problème.

1 votes

StackTrace ne mentionne nulle part DevExpress, mais seulement ma classe. Je vais devoir vérifier quel était le ErrorCode.

0 votes

Dans ce cas, essayez de déterminer ce qui a provoqué le message d'erreur.

9 votes

"en regardant la propriété ExternalException.ErrorCode" - avez-vous des conseils sur la manière exacte de le faire ? VS me montre "An unhandled exception of type 'System.Runtime.InteropServices.SEHException' occurred in ....dll Additional information : Eine externe Komponente hat eine Ausnahme ausgelöst.", mais en dehors des applications C#, par exemple, il n'y a aucun lien permettant de consulter les "détails" de l'objet d'exception.

9voto

Maurice Gilden Points 1363

J'ai eu un problème similaire avec une SEHException qui a été lancée lorsque mon programme a utilisé pour la première fois un wrapper de dll native. Il s'est avéré que la DLL native de ce wrapper était manquante. L'exception n'a été d'aucune aide pour résoudre le problème. Ce qui m'a finalement aidé, c'est de lancer procmon en arrière-plan et de vérifier s'il y avait des erreurs lors du chargement de toutes les DLL nécessaires.

5voto

Safran Ali Points 2469

Si vous rencontrez un problème tel que décrit dans ce post :

débogueur asp.net mvc lançant une SEHException

alors la solution est :

si vous avez une application de Trusteer (comme rapport ou autre), désinstallez-la et redémarrez votre système, cela fonctionnera bien... j'ai trouvé cette solution ici :

http://forums.asp.net/t/1704958.aspx/8/10?Re+SEHException+décrochée+lorsque+je+lance+l'application

3voto

ChrisW Points 37322

Les fabricants de composants affirment que ce problème a été corrigé dans la dernière version de leur composant, que nous utilisons en interne, mais qui n'a pas encore été transmis au client.

Demandez au fabricant du composant comment tester si le problème rencontré par le client est celui qu'il dit avoir résolu dans sa dernière version, sans/avant de déployer sa dernière version au client.

1voto

Conrad Points 550

J'ai rencontré cette erreur lorsque l'application réside sur un partage réseau et que l'appareil (ordinateur portable, tablette, ...) se déconnecte du réseau alors que l'application est utilisée. Dans mon cas, c'était dû à une tablette Surface qui se trouvait hors de portée du réseau sans fil. Aucun problème après l'installation d'un meilleur WAP.

1 votes

Je l'ai eu de manière aléatoire en accédant à différents types de réflexion (GetAssemblyName, GetProperty, Activator, etc.) à la fois dans mon code et dans des bibliothèques tierces, et juste dans l'environnement d'un client, de même avec des bibliothèques sur un site distant. Beaucoup de preuves qu'il s'agit d'un bug du framework .net.

0 votes

Andriy K : Je ne pense pas qu'il s'agisse d'un problème .NET, je pense que les manipulations des fichiers ouverts sur le partage réseau sont perdues. \dropped d'une manière ou d'une autre, peut-être un bug de Windows ou un problème de réseau. Les assemblages sont mappés en mémoire et seront paginés à partir du disque à la demande (bombe à retardement), la mémoire peut éventuellement être abandonnée dans des situations de faible mémoire également. Si les poignées de fichiers ouverts ne sont pas stables, cela va probablement partir en fumée. .NET pourrait peut-être s'en occuper et rouvrir le fichier (régler le problème), mais cela peut être compliqué.

0 votes

J'ai le même problème. J'obtiens System.Runtime.InteropServices.SEHException (0x80004005) sans trace de pile. Il s'agit de l'InnerException d'une TargetInvocationException. L'exception TargetInvocationException a une trace dans la pile, mais cela n'a aucun sens pour moi car elle semble provenir de main ou de Application.Run. Cela se produit de manière très aléatoire, principalement le soir \night. Je suppose que la seule "solution" est de ne pas exécuter le programme à partir d'un lecteur réseau :-| Je pourrais peut-être ajouter une vérification qui bloque ce scénario : stackoverflow.com/questions/8633680/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X