Quelle est la cause de "cette application a demandé au Runtime de le terminer d'une manière inhabituelle"?

Il y a une erreur commune qui est lancée par le Runtime Visual C:

Cette application a demandé au Runtime de le terminer d'une manière inhabituelle.
Veuillez contacter l'équipe de support de l'application pour plus d'informations.

Que signifie réellement ce message d'erreur ?


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

Cette 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 L'échec général était un général de brigade qui essayait de lire mon lecteur C, ou que vous pourriez être transporté 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ée dans winbase.h avec la valeur 0xC0000005). Cette constante une exception possible code d'erreur qui peut être renvoyée dans un EXCEPTION_RECORD structure. Le code ACCESS_VIOLATION signifie que le programme a essayé de lire ou d'écrire à une adresse en mémoire qu'il ne devrait pas être. Si vous essayez de lire à partir d'une adresse mémoire qui n'a jamais été allouée, alors vous faites quelque chose d'horriblement mauvais - et l'exception vous le dit.

C'est généralement causé quand un programme a un pointeur vers 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 ne l'est pas valide.

Note: je suis pas demandant:

  • pourquoi le programme x obtenir une erreur C0000005?
  • pourquoi mon code de recevoir une violation d'accès?
  • comment déboguer une violation d'accès?

Donc, si je vous demandais, ce qui cause une violation d'accès , vous ne me diriez pas de vérifier la trace de la pile, ou de regarder la fenêtre de sortie, ou de poster un exemple de code. Vous dites, "c'est d'essayer d'accéder à la mémoire qui n'est pas valide."


Retour à ma question. Que signifie l'erreur suivante:

Cette application a demandé à L'exécution de se terminer d'une manière inhabituelle.

Je suis (assez) 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:

  • Qu'est-ce que cela signifie de terminer le C visuel bibliothèque d'exécution? (msvcrt est une dll; vous ne la terminez pas, vous ne l'utilisez plus)
  • quelle serait une façonhabituelle de terminer MSVCRT?
  • Est-ce que quelqu'unchoisirait pour y mettre fin d'une manièreinhabituelle ?
  • la manière inhabituelle d'aujourd'hui est-elle en fait une forme obsolète depuis longtemps de ce qui était la manièrehabituelle ?
  • Si jeétais (par erreur) le terminant d'une manière inhabituelle, que ferais - je pour le terminer de la manière habituelle ?

En d'autres termes: quelle erreur le MSVCRT attrape-t-il et se cache-t-il derrière le message d'erreur non informatif?

50
demandé sur Ian Boyd 2011-11-18 06:46:39

1 réponses

Vous obtenez ce message lorsque abort() la fonction est appelée.

À Partir de MSDN:

Abandonner

Annule le processus en cours et renvoie un code d'erreur.

void abort( void );

Valeur De Retour

Abort ne retourne pas le contrôle au processus appelant. Par défaut, il met fin au processus en cours et renvoie un code de sortie de 3.

Remarques

Par défaut, la routineabort imprime message:

" Cette application a demandé au Runtime de la terminer d'une 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 runtime VC, le message a été remplacé par "abort () a été appelé" peut - être pour clarifier ce que cela signifie vraiment. Si vous voulez reproduire ce message, utilisez un ancien runtime VC (VC++ 6.0 à coup sûr) et appelez abort().

En Interne, lors de abort() est appelé, il appelle une fonction _amsg_exit , définie en interne.h, qui essentiellement "émet le message d'erreur d'exécution à stderr pour les applications de console, ou affiche le message dans une boîte de message pour les applications Windows". Le message d'erreur pour "cette application a demandé au Runtime de le terminer d'une manière inhabituelle" est défini dans le 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 qui est transmis (_RT_ABORT) est définie dans rterr.h:

Rterr.h

#define _RT_ABORT  10  /* Abnormal program termination */

Donc alternativement, vous pouvez reproduire ceci en appelant _amsg_exit( _RT_ABORT )


Mise à jour par question poster : 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 termine soudainement avec le message cette application a demandé au Runtime de le terminer dans d'une manière inhabituelle. Ce qui s'est passé?

Ça le message est imprimé par la fonction d'exécution C abort, le même fonction qui provoque également votre programme à terminer avec le code de sortie 3.

Votre programme peut appeler abort explicitement, ou il peut finir par être appelé implicitement par la bibliothèque d'exécution lui-même.

La norme c++ définit les conditions dans lesquelles terminate est appelé, et c'est une liste assez longue, donc je ne vais pas prendre la peine de les répéter ici. Consultez votre copie préférée de la norme C++ pour plus de détails. (Le raison la plus courante est de lancer une exception non gérée.)

38
répondu JosephH 2017-04-18 19:42:29