2011-03-14 14 views
26

Me preguntaba acerca de la excepción 0xc0000005 y lo que realmente abarca.¿Cuál es exactamente el alcance de la Infracción de acceso '0xc0000005'?

I.e. Supongo que esto ocurre si una aplicación intenta acceder a memoria/memoria liberada perteneciente a otro proceso.
Pero, ¿qué pasa con, por ejemplo, una dirección asignada para el hardware? ¿O una dirección fuera del rango válido? ¿Intenta acceder a estos errores con el mismo código o tienen los suyos? ¿Esto incluye lecturas fallidas a direcciones válidas propiedad del proceso?

Esencialmente, quiero saber cuándo una aplicación falla con esta excepción, lo que pudo haber salido mal; ¿Es esta una falla estrecha que solo podría haber venido de las aplicaciones? código o estoy mirando algo e incluyendo problemas de hardware?

(sé que debe ser una página de MSDN en esto, pero la búsqueda de Google o MSDN trae a colación los esperados 100 páginas de solución de problemas de aplicaciones al azar;))

Gracias!

Respuesta

31

Necesita leer el manual del procesador para profundizar en esto. Se desencadena por una "trampa", mejor descrita como una excepción en el procesador. Una trampa interrumpe la ejecución del código y permite que un controlador del sistema operativo "atrapar" maneje la falla. Una de las más comunes es una falla de página, que se produce cuando el procesador intenta leer datos de la memoria RAM que aún no se ha mapeado. Así es como se implementa la memoria virtual.

Un AccessViolation pertenece a un grupo de trampas que son fallas difíciles que el sistema operativo no sabe cómo manejar. Se llama "Error de protección general" en el manual del procesador. Es una especie de saco de sorpresas, hay muchas maneras de activar un GPF. Con mucho, el más común es tratar de leer la memoria que no está asignada, generalmente causada por la corrupción de la memoria del montón. Seguido de intentar ejecutar una instrucción de código de máquina que no es válida o solo puede ser ejecutada por código privilegiado, generalmente causado por corrupción de la memoria de la pila.

Estas trampas son tan desagradables como vienen, el procesador simplemente no puede continuar ejecutando el programa. El sistema operativo ciertamente no sabe cómo manejarlo, genera una excepción de AccessViolation para darle al programa la posibilidad de volver el procesador a un código conocido. Posible utilizando las palabras clave __try/__except en su código. No es una gran idea, salvo para los informes de errores personalizados, no tienes una idea real de cómo el estado de tu programa se mutó antes de morir y, por lo tanto, no hay forma de restaurarlo.

Sin dicho controlador SEH, esto termina en un respaldo que proporciona Windows. Puede proporcionar el suyo con SetUnhandledExceptionFilter(), útil para personalizar el informe de fallos. El proporcionado por el sistema pone fin al desencadenamiento de WER, el componente de informe de errores de Windows. Que finalmente termina el proceso.

+1

Gracias por la explicación clara y precisa. No sabía que se originó en el procesador en sí, tiene más sentido pensar así. "tan desagradable como ellos vienen" ¡De hecho! Me pregunto cuánto tiempo pasará antes de que los procesadores comiencen a enviar información útil cuando se activen estas excepciones/trampas/interrupciones. – sebf

+0

¡Gracias! (Y útil siempre es bueno, ¿no?) :) – sebf

0

Obtuve this como mi primer resultado para "violación de acceso" (sin comillas) en google. No estoy seguro de los detalles, pero un AV simplemente significa que: el procesador intentó leer o escribir en una dirección particular que su estado actual no permitía. Podría ser un problema de hardware, un error de bus, memoria virtual no asignada, mala CPU; prácticamente cualquier cosa que indique una violación de las protecciones de acceso.

+0

Generalmente causado por errores de software. – Zeek

13

En primer lugar, debe entender que las direcciones en un proceso de modo de usuario son direcciones virtuales. No son las direcciones reales utilizadas para acceder al hardware. Por el contrario, existe un circuito de traducción virtual a físico en la CPU (parte de la unidad de gestión de memoria) que encuentra una entrada correspondiente en el "Búfer de traducción Lookaside". Durante cada cambio de contexto, el sistema operativo rellena el TLB con las asignaciones de memoria que pertenecen a su proceso.

Así que no hay forma de intentar acceder a la memoria perteneciente a otros procesos, ni puede intentar acceder al hardware. No es que este acceso se detecte y falle, es que no existe una asignación para la memoria que no pertenece a su programa.

Si su programa accede a una dirección que no se asigna a ninguna parte, se producirá una trampa como dijo Hans. Es la misma trampa para "fallas de página" y "violaciones de acceso". Primero, el sistema operativo verificará si la dirección es válida pero no está en el TLB (por ejemplo, su PC se quedó sin memoria y parte se transfirió al disco). En ese caso, el sistema operativo volverá a mover los datos a la memoria RAM física, establecerá la asignación correcta en el TLB y continuará ejecutando su programa. Si el sistema operativo determina que la dirección es completamente inválida (no hay una ubicación de intercambio asociada), generará una "infracción de acceso" (denominación de Windows) o "falla de segmentación" (denominación POSIX).

Por lo general, la causa es un error de lógica, pero si tenía, p. una falla de RAM que cambió un poco en uno de sus indicadores, la falla de hardware también podría provocar una infracción de acceso.

+0

Gracias por la descripción del funcionamiento del TLB, es muy útil para comprender cómo se producen estas excepciones. Encuentro todos estos detalles técnicos muy interesantes, aunque me siento muy tonto ahora por el modelo de usuario que he tenido hasta ahora de que la arquitectura es solo una gran versión de los procesadores mucho más simples con los que estoy acostumbrado a trabajar. Trataré de encontrar un manual x86 para que pueda entenderlo correctamente. – sebf

Cuestiones relacionadas