Pregunta

Agregué un código que se compila limpiamente y acabo de recibir este error de Windows:

---------------------------
(MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error
---------------------------
The exception Privileged instruction.

 (0xc0000096) occurred in the application at location 0x00486752.

Estoy a punto de emprender una búsqueda de errores y espero que sea algo tonto que haya hecho y que resulte en producir este mensaje.El código se compila limpiamente sin errores ni advertencias.El tamaño del archivo EXE ha aumentado a 1.454.132 bytes e incluye enlaces a ODCS.lib, pero por lo demás es C puro para la API de Win32, con DEBUG activado (ejecutándose en un P4 en Windows 2000).

¿Fue útil?

Solución

Para responder a la pregunta, una instrucción privilegiada es un código de operación del procesador (instrucción de ensamblador) que solo se puede ejecutar en modo "supervisor" (o Anillo-0).Este tipo de instrucciones tienden a usarse para acceder a dispositivos de E/S y estructuras de datos protegidas desde el kernel de Windows.

Los programas normales se ejecutan en "modo usuario" (Ring-3), lo que no permite el acceso directo a dispositivos de E/S, etc.

Como otros mencionaron, la causa es probablemente una pila dañada o una llamada de puntero de función incorrecta.

Otros consejos

Este tipo de cosas suele ocurrir cuando se utilizan punteros de función que apuntan a datos no válidos.También puede suceder si tiene un código que destruye su pila de devolución.A veces puede resultar bastante complicado localizar este tipo de errores porque, por lo general, son difíciles de reproducir.

Una instrucción privilegiada es una instrucción IA-32 que solo puede ejecutarse en Ring-0 (es decir,modo núcleo).Si estás haciendo esto en el espacio de usuario, tienes un EXE muy antiguo o un binario dañado.

La primera probabilidad que se me ocurre es que esté utilizando una matriz local y esté cerca de la parte superior de la declaración de función.Su verificación de límites se volvió loca y sobrescribió la dirección de retorno y apunta a alguna instrucción que solo el kernel puede ejecutar.

Como sospechaba fue algo tonto lo que hice.Creo que resolví esto el doble de rápido debido a algunas de las pistas en los comentarios de los mensajes anteriores.Gracias especialmente a aquellos que señalaron algo al principio de la aplicación que sobrescribía la pila.De hecho, encontré varias respuestas aquí más útiles que la publicación que marqué como respuesta a la pregunta, ya que me dieron pistas y me pusieron en cola sobre dónde buscar, aunque creo que resume mejor la respuesta.

Resultó que acababa de agregar un botón que superaba el tamaño máximo de una matriz que contenía información de los botones de la barra de herramientas (que estaba en la pila).lo habia olvidado

#define MAX_NUM_TOOBAR_BUTTONS  (24)

¡Incluso existió!

La ubicación del error 0x00486752 me parece realmente pequeña, antes de donde suele vivir el código ejecutable.Estoy de acuerdo con Daniel, me parece un puntero descabellado.

Vi esto con Visual c++ 6.0 en el año 2000.

La biblioteca de depuración de C++ tenía llamadas a instrucciones de E/S físicas, en un controlador de excepciones.Si no recuerdo mal, se volcaba el estado a un puerto de E/S que solía ser para registros base DMA, que supongo que alguien en Microsoft estaba usando como tarjeta depuradora.

Busque alguna condición de error que pueda estar latente y provocar que se ejecute el código de diagnóstico.

Estuve depurando, retrocedí y leí el desmontaje.Fue una excepción durante el procesamiento. std::string, tal vez indexando el final.

Las CPU de la mayoría de procesadores fabricados en los últimos 15 años tienen unas instrucciones especiales que son muy potentes.Estas instrucciones privilegiadas se conservan para las aplicaciones del kernel del sistema operativo y no pueden ser utilizadas por programas escritos por el usuario.

Esto restringe el daño que un programa escrito por el usuario puede infligir al sistema y reduce la cantidad de veces que el sistema realmente falla.

Cuando se ejecuta en modo kernel, el sistema operativo tiene acceso ilimitado tanto al kernel como a la memoria del programa de usuario.

Las instrucciones de carga para los registros base y límite son instrucciones privilegiadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top