62 votes

Quelle est la cause du message "Cette application a demandé au Runtime de la 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 la terminer d'une manière inhabituelle.
Veuillez contacter l'équipe d'assistance de l'application pour plus d'informations.

Que signifie réellement ce message d'erreur moyenne ?


Laissez-moi utiliser une parabole pour expliquer exactement ce que je demande.

Si je vois un message :

Exception : violation d'accès (0xc0000005), Adresse 0x702be865

Ce site violation de l'accès n'a rien à voir avec le harcèlement sexuel, ni avec le fait que quelqu'un essaie de pénétrer dans mon ordinateur (pas plus que le général Failure n'était un général de brigade qui essayait de lire mon disque C, ou que vous pouviez être traîné en prison pour avoir effectué une opération illégale dans Windows 95).

Dans ce cas, violation de l'accès correspond à la constante EXCEPTION_ACCESS_VIOLATION (déclaré dans winbase.h avec la valeur 0xC0000005). Cette constante est un code d'erreur d'exception possible qui peut être renvoyé dans un message de type 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 avoir. Si vous essayez de lire une adresse mémoire qui n'a jamais été allouée, vous faites quelque chose d'horriblement mauvais - et l'exception vous le dit.

Il est généralement Elle est provoquée lorsqu'un programme dispose d'un pointeur vers une mémoire qui n'est pas, ou plus, valide. La solution est d'arrêter d'essayer d'accéder à la mémoire qui n'est pas valide.

Nota : Je suis no demandant :

  • pourquoi le programme x Vous obtenez une erreur C0000005 ?
  • pourquoi mon code obtient-il une violation d'accès ?
  • comment déboguer une violation d'accès ?

Donc si je te 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 diriez, "C'est en essayant d'accéder à une mémoire qui n'est pas valide."

Retour à ma question

Que signifie l'erreur suivante :

Cette application a demandé au Runtime de se terminer d'une manière inhabituelle.

Je suis (presque) certain que la bibliothèque du moteur d'exécution Visual C de Microsoft 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 résilier la bibliothèque d'exécution de Visual C ? (msvcrt est une dll ; vous ne la terminez pas, vous ne l'utilisez simplement plus).
  • Qu'est-ce qui serait habituel manière de mettre fin à MSVCRT ?
  • Est-ce que quelqu'un choisissez pour le terminer dans un inhabituel Comment ?
  • Est-ce que le inhabituel est en fait une forme dépréciée depuis longtemps de ce qui était autrefois le habituel Comment ?
  • Si je était (par erreur) en le terminant d'une manière inhabituelle, que dois-je faire pour le terminer dans la bonne direction ? habituel Comment ?

En d'autres termes, quelle erreur le MSVCRT détecte-t-il et cache-t-il derrière le message d'erreur non informatif ?

0 votes

Lorsque le message dit "Terminer", cela signifie "terminer l'application", et non "terminer le runtime". Je n'ai pas trouvé de documentation sur MSDN, mais ce message a été mentionné dans un certain nombre de fils de discussion : le consensus semble être qu'il signifie qu'une exception a été levée et n'a jamais été attrapée.

5 votes

Cette question est tellement bien écrite que je la voterais et l'étoilerais même si je ne la trouvais pas utile. En particulier, j'aime votre proposition de déclaration pour TerminateRuntime . (J'ai pris la liberté de nettoyer quelques petites choses comme les majuscules ; je suis impressionné par le fait que cela soit aussi complet et bien écrit sans une seule édition (non-Ninja) avant la mienne).

44voto

JosephH Points 3668

Vous recevez ce message lorsque abort() est appelée.

De MSDN :

abandonner

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, elle met fin au processus en cours et renvoie un code de sortie de 3.

Remarques

Par défaut, le abandonner imprime le message :

"Cette application a demandé au Runtime de la terminer d'une manière inhabituelle. Veuillez contacter l'équipe d'assistance 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() has been called" peut-être pour clarifier ce qu'il signifie vraiment. Si vous voulez reproduire ce message, utilisez un ancien runtime VC( VC++ 6.0 pour sûr), et appelez abort() .

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

rterr.h

#define _RT_ABORT  10  /* Abnormal program termination */

Alternativement, vous pouvez reproduire ceci en appelant _amsg_exit( _RT_ABORT )


Mise à jour par l'auteur 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, et soudainement il se termine avec le message Cette application a demandé au Runtime de la terminer d'une façon d'une manière inhabituelle. Que s'est-il passé ?

Ce message est imprimé par la fonction d'exécution C abort la même fonction qui fait aussi que votre programme terminer avec un code de sortie 3 .

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

La norme C++ énonce 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 exemplaire préféré de la norme C++ pour plus de détails. (La raison raison la plus courante est de lancer une exception non gérée).

3 votes

Tu gagnes exactement. C'est exactement la cause du message, le programmeur a appelé abort() . Si je veux arrêter cette erreur, le développeur doit arrêter d'appeler abort() .

2 votes

Bonne réponse. Et je voudrais savoir comment résoudre cette erreur ? Pour être plus explicite, comment savoir quelle exception n'est pas attrapée et où elle est lancée ?

0 votes

Au cas où quelqu'un tomberait sur cette question comme moi (j'ai AM l'équipe de support de l'application et je n'ai pas pu me contacter) et voudrait savoir comment trouver qui a abandonné, consultez cette autre question pour savoir comment créer une fonction de terminaison dans laquelle vous pouvez placer un point d'arrêt : stackoverflow.com/questions/2443135/

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