Il y a une erreur commune qui est générée par le Visual C Runtime:
Cette application a demandé au Runtime de le terminer de manière inhabituelle.
Veuillez contacter l'équipe de support de l'application pour plus d'informations.
Qu'est-ce que ce message d'erreur signifie réellement signifie?
Permettez-moi d'utiliser une parabole pour expliquer exactement ce que je demande.
Si je vois un message:
Exception: violation d'accès (0xc0000005), adresse 0x702be865
Ceci violation d'accès n'a rien à voir avec le harcèlement sexuel, ou quelqu'un essayant de pénétrer dans mon ordinateur (pas plus que General Failure n'était un brigadier général qui essayait de lire mon lecteur C, ou être conduit en prison pour avoir effectué une opération illégale dans Windows 95).
Dans ce cas, violation d'accès correspond à la constante EXCEPTION_ACCESS_VIOLATION
(déclaré dans winbase.h
avec la valeur 0xC0000005). Cette constante, un code d'erreur d'exception possible peut être renvoyée dans un EXCEPTION_RECORD
structure. Le code ACCESS_VIOLATION
_ signifie que le programme a essayé de lire ou d’écrire sur une adresse en mémoire qu’elle ne devrait pas être. Si vous essayez de lire à partir d'une adresse mémoire qui n'a jamais été allouée, vous agissez horriblement mal - et l'exception vous le dit.
Il est généralement causé lorsqu'un programme a un pointeur sur la mémoire qui n'est pas ou n'est plus valide. La solution est d'arrêter d'essayer d'accéder à la mémoire qui n'est pas valide.
Note: Je suis pas demande:
- pourquoi le programme x obtient-il une erreur C0000005?
- pourquoi mon code obtient-il une violation d'accès?
- comment déboguer une violation d'accès?
Donc, si je vous demandais ce qui provoque une violation d'accès, vous ne me diriez pas de vérifier le suivi de la pile, de regarder la fenêtre de sortie ou d'envoyer un exemple de code. Vous diriez, "C'est d'essayer d'accéder à de la mémoire qui n'est pas valide."
Revenons à ma question. Que signifie l'erreur suivante:
Cette application a demandé au Runtime de se terminer de manière inhabituelle.
Je suis (à peu près) certain que la bibliothèque d'exécution Microsoft Visual C n'a pas de fonction:
void TerminateRuntime(bool UnusualWay);
Je dois donc essayer de comprendre ce que cela signifie réellement:
En d'autres termes: quelle erreur le MSVCRT intercepte-t-il et se cache-t-il derrière le message d'erreur non informatif?
Vous obtenez ce message lorsque la fonction abort()
est appelée.
avorter
Abandonne le processus en cours et renvoie un code d'erreur.
void abort( void );
Valeur de retour
abandonner ne rend pas le contrôle au processus appelant. Par défaut, il termine le processus en cours et renvoie un code de sortie de 3.
Remarques
Par défaut, la routine Interrompre imprime le message:
"Cette application a demandé au Runtime de le terminer de manière inhabituelle. Veuillez contacter l'équipe de support de l'application pour plus d'informations."
Il semble que dans la version récente du moteur d'exécution VC, le message a été remplacé par "abort () a été appelé"), peut-être pour clarifier ce que cela signifie réellement. Si vous souhaitez reproduire ce message , utilisez un ancien VC runtime (VC++ 6.0 bien sur)) et appelez abort()
.
En interne, lorsque abort()
est appelé, il appelle une fonction _ amsg_exit , définie dans internal.h, qui "émet essentiellement le message d'erreur d'exécution à stderr pour console, ou affiche le message dans une boîte de message pour les applications Windows ". Le message d'erreur "Cette application a demandé au Runtime de le terminer de manière inhabituelle" est défini dans le fichier cmsgs.h:
cmsgs.h :
#define _RT_ABORT_TXT "" EOL "This application has requested the Runtime to terminate it in an unusual way.\nPlease contact the application's support team for more information." EOL
et le code d'erreur transmis (_RT_ABORT
) est défini dans rterr.h:
rterr.h
#define _RT_ABORT 10 /* Abnormal program termination */
Donc, alternativement, vous pouvez reproduire cela en appelant _amsg_exit( _RT_ABORT )
Mise à jour par le poster de la question : Deux semaines après avoir posé cette question, Raymond Chen y a répondu dans son propre blog :
Vous exécutez votre programme, puis il se ferme soudainement avec le message Cette application a demandé au Runtime de le terminer de manière inhabituelle. Que s'est-il passé?
Ce message est imprimé par l'abandon de la fonction d'exécution C , la même fonction qui entraîne également votre programme se termine par le code de sortie .
Votre programme peut appeler explicitement l'abandon, ou il peut être appelé implicitement par la bibliothèque d'exécution elle-même.
- La macro d'assertion appelle l'abandon lorsqu'une assertion échoue.
- Par défaut, la fonction de terminaison appelle l'abandon.
La norme C++ énonce les conditions dans lesquelles
terminate
est appelé, et la liste est assez longue, je ne vais donc pas m'empêcher de les répéter ici. Consultez votre copie préférée de la norme C++ pour plus de détails. (La raison la plus courante est de lancer une exception non gérée.)