Bienvenido! - Willkommen! - Welcome!

Bitácora Técnica de Tux&Cía., Santa Cruz de la Sierra, BO
Bitácora Central: Tux&Cía.
Bitácora de Información Avanzada: Tux&Cía.-Información
May the source be with you!

Tuesday, November 18, 2008

La memoria no se puede "written"/"read"

Source
Uno de los problemas que más recibo y que pienso que más despista a la gente es un error del tipo "La instrucción en "0xnúmero_hexadecimal" hace referencia a la memoria en "0xnúmero_hexadecimal". La memoria no se puede "written"/"read". Observe la siguiente imagen que ilustra el error:

Mensaje de error de aplicación

Mucha gente asocia este mensaje de error con un problema con la memoria RAM, pensando que pudiera estar dañada o que quede poca disponible. Probablemente el problema no se deba a un módulo defectuoso de RAM.

Ese mensaje de error es la manera "fea" que tiene Windows XP de decir que ha ocurrido una excepción en modo usuario porque alguna aplicación o componente ha intentado acceder a una posición de memoria que no debería (por ejemplo, mediante un puntero erróneo). Esto se denomina infracción de acceso y se identifica mediante el código de error c0000005.

Veamos un poco qué ocurre por dentro de Windows cuando sucede un error de este tipo

Windows debe tener un mecanismo interno que le permita actuar de algún modo cuando ocurra una excepción no controlada en modo usuario. Para simplificar las cosas, supongamos que se trata de un bloque try convencional que puede lanzar la excepción mediante la función UnhandledExceptionFilter. En este momento, Windows examina el Registro para saber qué hacer una vez ha ocurrido un error de aplicación. La clave HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug contiene un valor Auto que le indica al sistema si debe iniciar automáticamente el depurador por defecto del sistema, definido éste en el valor Debugger. El depurador por defecto de Windows XP es Dr Watson.

Nota: Si instala alguna aplicación relacionada con el desarrollo, es probable que ésta instale su propio depurador. Quizá también lo establezca automáticamente como depurador por defecto del sistema.


En este momento se carga la dll Faultrep.dll que examina el Registro para saber cómo desea el usuario que se le informe de los errores de aplicación. La clave de Registro HKLM\SOFTWARE\Microsoft\PCHealth\ErrorReporting contiene la información accesible desde la interfaz gráfica de Windows en el panel Informe de errores, situado en la pestaña Opciones avanzadas de Propiedades de sistema. Observe la siguiente imagen:

Panel Informe de errores de Windows XP

Si se desea que se muestre una intuitiva interfaz gráfica (valor ShowUI distinto de cero), Windows cargará el proceso \WINDOWS\system32\Dwwin.exe en memoria, que es el que muestra la típica pantalla de error de aplicación de Windows XP, mostrada en la siguiente imagen:

Típica ventana de error de aplicación de Windows XP

Si el valor ShowUI es igual a cero, siempre obtendrá la pantalla mostrada al principio del artículo, que no ofrece la posibilidad de ver el módulo afectado por el error ni de enviar la información a Microsoft. Dependiendo de la aplicación que haya generado el error, es posible que se le muestre esta pantalla pese a que utilice la configuración por defecto. No debe preocuparse, se trata del mismo problema: una excepción no controlada en modo usuario.

¿Cómo solucionar el problema?

En primer lugar debe asegurarse de que el sistema esté libre de virus y ficheros espía. Un sistema infectado puede producir excepciones de este tipo. En segundo lugar, revise la esquina superior izquierda del título de la ventana de error, es posible que se haga referencia a un fichero de terceros conocido, en cuyo caso habría que contactar con el fabricante para informarse de si es un problema conocido o de si existe alguna solución al respecto.

Si el proceso referenciado fuese demasiado inespecífico (como por ejemplo Explorer.exe), no queda más remedio que hacer pruebas iniciando el sistema en Modo seguro o realizar sucesivos inicios limpios hasta dar con el posible culpable.

También es posible examinar la información registrada por el depurador de programa.

Nota: Si el proceso referenciado fuese Iexplore.exe, es posible que algún añadido (plug-in) sea el que ha generado la excepción. Si usa Internet Explorer 7, ejecute el navegador sin complementos y observe si se reproduce el problema. Para ejecutar el navegador sin complementos abra Inicio, Ejecutar, escriba "%ProgramFiles%\Internet Explorer\iexplore.exe" -extoff y pulse Aceptar.


En este caso deberá pulsar sobre Cancelar en la ventana de error para depurarlo. Abra Inicio, Ejecutar, escriba "%AllUsers%\Datos de programa\Microsoft\Dr Watson" (con comillas) y pulse Aceptar. Observará dos ficheros: Drwtsn32.log contiene un reporte con todos los errores de aplicación que han sido administrados por Dr Watson. Los últimos errores recibidos se sitúan al final de la lista. User.dmp suele ser un pequeño volcado de la memoria en el momento del error. Este fichero se sobreescribe cada vez que ocurre un error de aplicación. Puede cargar este fichero en cualquier depurador como Windbg (http://www.microsoft.com/whdc/devtools/debugging/default.mspx) para examinarlo.

Espero que este artículo haya aclarado algunas dudas acerca de esa "extraña" ventana que nos indica que la memoria no se puede "read" (o "written") y que nos podemos encontrar cuando nos topamos con software mal diseñado en nuestro sistema.

No comments: