windows language-agnostic msvcrt

windows - ¿Cuál es la causa de "Esta aplicación ha solicitado al Runtime que termine de manera inusual"?



language-agnostic msvcrt (1)

Hay un error común que es lanzado por el tiempo de ejecución de Visual C:

Esta aplicación ha solicitado al Runtime que termine de una manera inusual.
Por favor, póngase en contacto con el equipo de soporte de la aplicación para obtener más información.

¿Qué significa realmente este mensaje de error?

Déjame usar una parábola para explicar exactamente lo que estoy preguntando.

Si veo un mensaje:

Excepción: infracción de acceso (0xc0000005), dirección 0x702be865

Esta violación de acceso no tiene nada que ver con el acoso sexual, o alguien que intenta ingresar a mi computadora (más que General Failure fue un general de brigada que estaba tratando de leer mi disco C, o que podría ser llevado a la cárcel por realizar Operación ilegal en Windows 95).

En este caso, la infracción de acceso corresponde a la constante EXCEPTION_ACCESS_VIOLATION (declarada en winbase.h con valor 0xC0000005). Este constante posible código de error de excepción se puede devolver en una estructura EXCEPTION_RECORD . El código ACCESS_VIOLATION significa que el programa intentó leer o escribir en una dirección en la memoria que no debería ser. Si intentas leer desde una dirección de memoria que nunca se asignó, entonces estás haciendo algo terriblemente malo, y la excepción te lo dice.

Generalmente se produce cuando un programa tiene un puntero a la memoria que no es, o ya no es, válido. La solución es dejar de intentar acceder a la memoria que no es válida.

Nota : No estoy preguntando:

  • ¿Por qué el programa x recibe un error C0000005?
  • ¿Por qué mi código está obteniendo una infracción de acceso?
  • ¿Cómo depuro una violación de acceso?

Entonces, si le preguntara qué causa una infracción de acceso , no me diría que verifique el seguimiento de la pila, ni que vea la ventana de resultados ni que publique un código de muestra. Diría: "Es porque intentar acceder a la memoria no es válido".

De vuelta a mi pregunta. ¿Qué significa el siguiente error?

Esta aplicación ha solicitado al Runtime que termine de una manera inusual.

Estoy (bastante) seguro de que la biblioteca de Microsoft Visual C Runtime no tiene una función:

void TerminateRuntime(bool UnusualWay);

Así que tengo que tratar de averiguar lo que realmente significa:

  • ¿Qué significa terminar la biblioteca de tiempo de ejecución de C visual? (msvcrt es una DLL; no la terminas, simplemente ya no la usas)
  • ¿Cuál sería una forma habitual de terminar MSVCRT?
  • ¿Alguien elegiría terminarlo de una manera inusual ?
  • ¿Es la forma inusual de hoy una forma obsoleta de lo que solía ser la forma habitual ?
  • Si lo terminara (erróneamente) de una manera inusual, ¿qué haría para terminarlo de la manera habitual ?

En otras palabras: ¿qué error está detectando MSVCRT y ocultándose detrás del mensaje de error no informativo?


Obtienes ese mensaje cuando se llama a la función abort() .

abort()

abortar

Anula el proceso actual y devuelve un código de error.

void abort( void );

Valor de retorno

abortar no devuelve el control al proceso de llamada. De forma predeterminada, finaliza el proceso actual y devuelve un código de salida de 3.

Observaciones

De forma predeterminada, la rutina de cancelación imprime el mensaje:

"Esta aplicación ha solicitado al Runtime que termine de forma inusual. Póngase en contacto con el equipo de soporte de la aplicación para obtener más información".

Parece que en la versión reciente del tiempo de ejecución de VC, el mensaje ha sido reemplazado por "abort () ha sido llamado" tal vez para aclarar lo que realmente significa. Si desea reproducir ese mensaje, use un tiempo de ejecución de VC antiguo (VC ++ 6.0, por supuesto) y llame a abort() .

Internamente, cuando se llama a abort() , llama a una función _amsg_exit , definida en internal.h, que básicamente "emite el mensaje de error de tiempo de ejecución a stderr para aplicaciones de consola, o muestra el mensaje en un cuadro de mensaje para aplicaciones de Windows". El mensaje de error para "Esta aplicación ha solicitado que Runtime lo termine de una forma inusual" se define en 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

y el código de error que se pasa ( _RT_ABORT ) se define en rterr.h:

rterr.h

#define _RT_ABORT 10 /* Abnormal program termination */

Entonces, alternativamente, puedes reproducir esto llamando a _amsg_exit( _RT_ABORT )

Póster de actualización por pregunta : dos semanas después de que hice esta pregunta, Raymond Chen la respondió en su propio blog :

Está ejecutando su programa, y ​​luego se cierra repentinamente con el mensaje. Esta aplicación ha solicitado al Runtime que lo finalice de una manera inusual. ¿Que pasó?

Ese mensaje se imprime abort() de anulación en abort() , la misma función que también hace que su programa finalice con el código de salida 3 .

Es posible que su programa llame explícitamente a abortar, o que la propia biblioteca de tiempo de ejecución lo llame implícitamente.

El estándar de C ++ explica las condiciones bajo las cuales se llama terminate , y es una lista bastante larga, así que no me molestaré en repetirlas aquí. Consulte su copia favorita del estándar C ++ para más detalles. (La razón más común es lanzar una excepción no controlada.)