C++/CLI: Attraper tous les (.NET/Win32/CRT) exceptions
Je sais que c'est mal vu, mais je suis d'options ici. Je suis en développement C++/CLI application qui a un bug que je ne suis pas en mesure de traquer - principalement parce que c'est en contournant mon crash handler:
AppDomain::CurrentDomain->UnhandledException += gcnew UnhandledExceptionEventHandler(&LogAndExit);
Application::ThreadException += gcnew ThreadExceptionEventHandler(&LogAndExit);
Application::SetUnhandledExceptionMode(UnhandledExceptionMode::CatchException);
try
{
Application::Run(gcnew frmMain());
}
catch (Exception^ ex)
{
LogAndExit(ex);
}
catch (...)
{
LogAndExit();
}
Standard .NET, la gestion des incidents, je suppose. MSDN rapports que certains de la CRT exceptions soufflent au-dessus de la pile gérée et silencieusement à l'abandon de l'application.
J'ai lu sur _set_invalid_parameter_handler, mais même si j'obtiens une erreur LNK2001, il semble qu'il ne peut pas être utilisé avec /clr:pure. Suis-je en droit, ou suis-je juste PEBKACing et manque un fichier lib?
Debug + Exceptions, cochez la Levée des drapeaux.
Ne peut pas. N'ont pas de VS2010 installé sur les ordinateurs cibles.
Ne serait-il pas possible d'avoir le JIT dumper intégré à windows prenez un cliché pour vous?
Je suis en train d'écrire une image mémoire complète dès que je peux attraper l'exception - mais ce n'est pas toujours le cas. :/
Ne peut pas. N'ont pas de VS2010 installé sur les ordinateurs cibles.
Ne serait-il pas possible d'avoir le JIT dumper intégré à windows prenez un cliché pour vous?
Je suis en train d'écrire une image mémoire complète dès que je peux attraper l'exception - mais ce n'est pas toujours le cas. :/
OriginalL'auteur hb. | 2011-07-08
Vous devez vous connecter pour publier un commentaire.
Vous pouvez exécuter dans
/clr
mode? Si vous pouvez alors essayez ceci:Alors:
Une autre chose à noter: si votre application est multi-thread, alors vous aurez seulement intercepter une exception à partir du thread dans lequel
frmMain()
est en cours d'exécution. Donc en faisant un fourre-tout sur l'ensemble de votre application est impossible dans ce cas!ok, eh bien, la question est toujours valable: êtes-vous à l'exécution de plusieurs threads?
Le C++/CLI processus d'hôtes net.tuyau de service WCF, donc je suppose que c'est un oui. Toutes les méthodes sont try/catch aimerais bien (CLR)
et ils sont tous de la journalisation des exceptions je suppose? Si elles le sont, alors vous pourriez peut-être juste la trace de l'échec... bien sûr, vous le saviez déjà...
Ah... ouais, justement. Rien n'est montré, mais parfois il meurt.
OriginalL'auteur Kiril
Tout d'abord, cela ne fonctionne pas pour les formulaires.
Deuxième, il y a peut être un non géré exception (ce qui n'est pas de type Système::Exception).
msdn- Comment intercepter des exceptions dans Visual C++
Avez-vous lu l'article de MSDN sur la façon dont les formes sont touchés avec CurrentDomain->UnhandledException ?
Ouais. C'est qu'aucun de ces gestionnaires sont utilisés et juste par défaut la valeur par défaut de Windows "Cette application vient de tomber en panne boîte de dialogue"
OriginalL'auteur Yochai Timmer
Je vous recommande d'essayer un __try /__à l'exception
Documentation MSDN ici:
http://msdn.microsoft.com/en-us/library/s58ftw19(v=vs. 80).aspx
Si vous voulais avoir de vraiment difficile, vous pouvez essayer de doubler les enveloppant comme ceci:
Structurée des exceptions sont enveloppés dans des SEHException^ en général.
Vous devez également prendre en compte le fait que vous peut en fait être la capture de l'exception, mais que quelque chose dans votre LogAndExit méthode est à l'origine d'un secondaire exception qui est en fait ce qui est la fin de votre programme. Essayez de cogner votre LogAndExit de la fonction et de voir si vous pouvez faire le crash silencieux, plutôt qu'avec un standard de message d'abandon et/ou de l'enveloppe de votre LogAndExit code dans un autre try/catch qui cache tout de même des exceptions.
Comme quelqu'un qui a mis du temps significatif en C++/CLI, je peux sympathiser avec votre dilemme. Espérons que cette solution vous aide à.
Supplémentaires de la documentation MSDN sur le C++/CLI gestion des exceptions:
Comment: Définir et Installer un Gestionnaire Global d'Exception
http://msdn.microsoft.com/en-us/library/171ezxzc.aspx
La gestion des exceptions en vertu de l' /clr
http://msdn.microsoft.com/en-us/library/633chdda.aspx
OriginalL'auteur Jeremiah Gowdy
Il existe plusieurs types de gestion des exceptions. Ce que vous avez posté ne traitera que les exceptions gérées.
Il est également possible pour le code C++ à jeter non géré exceptions (notamment à partir de la bibliothèque standard). En outre, il est possible pour le code non managé pour lancer une exception Win32.
Commencez ici et de lire sur la gestion structurée des exceptions (Win32 exceptions). Les exceptions C++ et exceptions gérées sont construites sur le SEH, donc si vous manipulez des SEH à haut point de chaque fil dans votre processus, vous serez couvert.
Je crois que vous avez raison; clr:pure prend en charge uniquement le code managé.
Exceptions gérées utilisation de la SEH, et géré les gestionnaires gérer SEH exceptions. Si le code C++ est à l'aide de /Ire, toutes les exceptions qu'il jette utilisera SEH dessous. Il n'y a aucun moyen pour le code managé pour attraper natif exceptions C++ compilé avec le modèle synchrone (/EHsc).
Donc, si je vais avoir des exceptions C++, je suis SOL w/ selon une trace de la pile pour voir d'où ça vient?
I
OriginalL'auteur Stephen Cleary
Pas chaque panne est une exception, du moins pas immédiatement. Il est tout à fait possible pour un wild pointeur à écraser .NET structures de données internes si mal que lorsqu'une exception est levée, le gestionnaire de code managé peut pas s'exécuter correctement.
Essayez d'utiliser un natif de gestionnaire de la place. Visual C++ fournit
__try
/__except
, mais vous devrez vous assurer que le gestionnaire est sur la pile des appels de chaque fil dans votre programme, et il est toujours possible de faire une exception pour aller non gérée (par exemple CreateThread avec un pointeur vers une instruction illégale). Pour traiter tous les cas de bord, vous devez utiliser à la placeSetUnhandledExceptionFilter
.Noter qu'avec
/clr:pure
, l'ensemble du code dépend de la CLR, et donc soumise à l'échec en raison d'exécution à la corruption. Même natif des gestionnaires peut dépendre de l'état corrompu, même s'ils sont moins fragiles que MSIL à base de gestionnaires. Pour une bonne gestion des erreurs, vous avez vraiment besoin de code s'exécutant en dehors du processus.OriginalL'auteur Ben Voigt