Episodio
Infracción de acceso C0000005: ejecución
Se produce una infracción de acceso de ejecución cuando la aplicación intenta ejecutar código desde una dirección de memoria que no es válida. Para ser válido, la página de memoria debe tener un estado, protección y tipo válidos.
La memoria debe estar en estado MEM_COMMIT.
La memoria puede ser de cualquier tipo; MEM_IMAGE, MEM_MAPPED o MEM_PRIVATE. La gran mayoría es MEM_IMAGE. MEM_PRIVATE se usa para el código Just-In-Time (JIT): el ejemplo principal es JavaScript.
La protección de la memoria debe ser PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE o PAGE_EXECUTE_WRITECOPY. La gran mayoría es PAGE_EXECUTE_READ. PAGE_EXECUTE_READWRITE y PAGE_EXECUTE_WRITECOPY son poco frecuentes y se pueden considerar peligrosos, ya que el código se puede modificar (insertado).
Para ver el estado, la protección y el tipo de la dirección, use !address <>
- Asegúrese de hacer referencia a los valores actuales; no los valores de asignación
- Cada región de página de memoria (mínimo 4K) realiza un seguimiento del valor de protección inicial en la asignación y del valor de protección actual, tal y como establece la familia de funciones VirtualProtect .
El procesador detecta la infracción a través de la protección de ejecución de datos.
La dirección de memoria puede no ser válida debido a uno de estos escenarios comunes:
- Daños en la pila: la dirección de devolución de una llamada se inserta en la pila. Las variables locales están junto a esta ubicación. Si un local tiene una saturación del búfer, la dirección de retorno está dañada.
- Recuento de referencias de DLL: la dirección era válida, pero ahora se está accediendo después de descargar el archivo DLL.
- Volteo de bits: problema de RAM (hardware) en el que uno o varios bits se han volteado (poco frecuente)
Recursos adicionales:
Se produce una infracción de acceso de ejecución cuando la aplicación intenta ejecutar código desde una dirección de memoria que no es válida. Para ser válido, la página de memoria debe tener un estado, protección y tipo válidos.
La memoria debe estar en estado MEM_COMMIT.
La memoria puede ser de cualquier tipo; MEM_IMAGE, MEM_MAPPED o MEM_PRIVATE. La gran mayoría es MEM_IMAGE. MEM_PRIVATE se usa para el código Just-In-Time (JIT): el ejemplo principal es JavaScript.
La protección de la memoria debe ser PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE o PAGE_EXECUTE_WRITECOPY. La gran mayoría es PAGE_EXECUTE_READ. PAGE_EXECUTE_READWRITE y PAGE_EXECUTE_WRITECOPY son poco frecuentes y se pueden considerar peligrosos, ya que el código se puede modificar (insertado).
Para ver el estado, la protección y el tipo de la dirección, use !address <>
- Asegúrese de hacer referencia a los valores actuales; no los valores de asignación
- Cada región de página de memoria (mínimo 4K) realiza un seguimiento del valor de protección inicial en la asignación y del valor de protección actual, tal y como establece la familia de funciones VirtualProtect .
El procesador detecta la infracción a través de la protección de ejecución de datos.
La dirección de memoria puede no ser válida debido a uno de estos escenarios comunes:
- Daños en la pila: la dirección de devolución de una llamada se inserta en la pila. Las variables locales están junto a esta ubicación. Si un local tiene una saturación del búfer, la dirección de retorno está dañada.
- Recuento de referencias de DLL: la dirección era válida, pero ahora se está accediendo después de descargar el archivo DLL.
- Volteo de bits: problema de RAM (hardware) en el que uno o varios bits se han volteado (poco frecuente)
Recursos adicionales:
¿Quiere hacer algún comentario? Comunique un problema aquí.