Question

J'écris un petit utilitaire (VC 2010, pas de clr) qui effectue une tâche simple (rastérisation) en utilisant une bibliothèque tierce.Un utilitaire ultérieur sera utilisé par une application plus grande.Parfois, l'utilitaire se bloque en raison d'une corruption de tas dans une bibliothèque tierce.C'est OK, mais Windows (Vista / 2008) affiche la boîte de dialogue bien connue "Le programme a cessé de fonctionner ... Fermer / Déboguer le programme."ce qui n'est pas approprié dans mon cas (côté serveur).L'utilitaire devrait planter / se terminer silencieusement sans aucun effet visible.

Pour ce faire, j'ai installé SEH pour les exceptions non gérées (SetUnhandledExceptionFilter).Le gestionnaire est parfaitement invoqué pour des exceptions telles que AV (* (PDWORD) 0= 0), mais pour une raison quelconque, il n'est pas invoqué en cas de corruption de tas.La corruption se produit dans dllmain d'une des dll de bibliothèque tierce pendant son déchargement.

Quelques questions.Quelqu'un peut-il expliquer pourquoi le gestionnaire n'est pas appelé?Existe-t-il un autre moyen d'empêcher ce dialogue?

Était-ce utile?

La solution

Apparemment, il est intentionnel que les corruptions de tas ne puissent pas être interceptées par les gestionnaires d'exceptions définis par l'utilisateur, même si elles sont émises comme exceptions avec leur propre code d'exception (0xC0000374 "STATUS_HEAP_CORRUPTION"). Voici un rapport de bogue Visual C ++ qui a été essentiellement fermé comme "ne résoudra pas":

https: / /connect.microsoft.com/VisualStudio/feedback/details/664497/cant-catch-0xc0000374-exception-status-heap-corruption

Comme vous l'avez découvert, ce n'est pas un bogue dans le compilateur ou le système d'exploitation. La corruption du tas que votre fonction provoque est traitée comme une erreur critique et, dans le cadre de la gestion de cette erreur, le système d'exploitation met fin au processus. C'est ce qui empêche vos gestionnaires d'exceptions.

Je suppose que le rapport d'erreurs Windows ou d'autres moyens de créer un vidage sur incident pourraient toujours l'attraper.

Pour empêcher la boîte de dialogue, dans le registre, vous pouvez soit désactiver complètement WER, soit simplement désactiver la boîte de dialogue pour que le processus ne se bloque pas:

https:// msdn.microsoft.com/de-de/library/windows/desktop/aa366711(v=vs.85).aspx (voir "DontShowUI")

Autres conseils

mais pour une raison quelconque, il n'est pas invoqué en cas de corruption de tas.La corruption se produit dans dllmain d'une des dll de bibliothèque tierce pendant son déchargement.

La corruption de tas est un comportement indéfini.Il peut lancer des exceptions, il peut faire autrement.Si une bibliothèque tierce boguée gâche votre tas, alors la question est "pourquoi les autorisez-vous à jouer avec votre tas en premier lieu?"

La boîte de dialogue "Le programme a cessé de fonctionner" s'affiche chaque fois qu'un processus se termine anormalement.Toutes les terminaisons anormales de processus ne résultent pas d'exceptions.De nombreuses erreurs (telles que le débordement de pile, la pile mal alignée, etc.) provoquent l'arrêt instantané du processus, ce qui peut afficher ce message mais ne vous donnera pas une chance de gérer l'erreur.

(Voir également le super commentaire de Hans ci-dessus)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top