martes, febrero 05, 2008

¿Qué sucede cuando ocurre una excepción no manejada en modo usuario en Windows Vista?

Si ha leído artículos anteriores, seguramente ya conozca cómo funciona el mecanismo de excepciones no manejadas en modo usuario (user mode unhandled exceptions) en Windows XP. Básicamente consta de un filtro de excepciones no manejadas que "recubre" a todos los hilos de un proceso. Si se produce alguna excepción que no ha sido adecuadamente tratada, se iniciará el depurador post-mortem por defecto de Windows XP, Dr Watson, que recabará toda la información que ayude en el diagnóstico posterior del error. Sin embargo, esta forma de administrar excepciones en modo usuario es poco robusta. Por ejemplo, si la corrupción es tal que la pila del hilo en cuestión ha sido sobreescrita con basura, todo el mecanismo de tratamiento de excepciones fallará y el usuario únicamente verá como la aplicación desaparece de repente, sin dejar rastro ni mostrarse ningún mensaje de error. Quizá alguna vez haya experimentado esto en su sistema.

Para evitar esta mala experiencia de usuario, el mecanismo de excepciones no manejadas en modo usuario ha sido completamente rediseñado en Windows Vista. A continuación se muestra un diagrama explicativo:



Para empezar, un nuevo servicio denominado "Windows Error Reporting" (WerSvc), alojado en un proceso Svchost.exe, mantiene abierto un puerto de comunicación con el núcleo del sistema operativo. A través de este puerto, el núcleo del sistema operativo estará informado de toda excepción que ocurra en modo usuario (note que ahora es el núcleo el que maneja todo esto, cosa que no sucedía en versiones anteriores de Windows). El kernel conecta con la aplicación y le da la oportunidad de capturar y tratar la excepción. Si ésta no es tratada, la petición se dirige a cualquier otro puerto de excepciones que esté asociado a la aplicación en cuestión. Todas las excepciones no manejadas de aplicaciones Win32 acaban en Csrss.exe, que forma el subsistema Win32 y es un proceso crítico del sistema operativo. Csrss.exe retorna el valor EXCEPTION_CONTINUE_SEARCH, lo que hace que el kernel informe al servicio WerSvc antes mencionado sobre la aplicación que ha producido el fallo. WerSvc, basándose en la información que ha recibido (PID, tipo de excepción, etc.), crea un nuevo proceso, Werfault.exe, que decide si adjuntar o no un depurador a la aplicación. El código de la DLL Faultrep.dll alojada por dicho proceso es la encargada de examinar la clave correspondiente, que es la misma que en versiones anteriores de Windows: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug. Puede ver una captura de la traza correspondiente de Process Monitor:



Si hubiera un depurador disponible, se hará cargo del proceso en cuestión; si no lo hubiera, WerFault.exe generará un reporte del fallo y almacenará la información correspondiente para que sea tratada por el componente "Problemas y soluciones" de Windows Vista (WerCon). Al contrario de lo que ocurre en versiones anteriores de Windows, por defecto no se mantiene una copia del volcado de memoria del proceso en cuestión (imagino que por cuestiones de privacidad). Para modificar este comportamiento, abra Inicio, haga clic sobre Iniciar búsqueda, escriba regedit y elija el programa ofrecido. Acceda a la clave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting. Cree un nuevo valor DWORD de nombre ForceQueue y establézcale como contenido un 1. Reinicie el sistema y a partir de entonces los volcados de memoria se irán almacenando en las carpetas %AllUsersProfile%\Microsoft\Windows\WER (para procesos del sistema o con privilegios elevados), y en %LocalAppData%\Microsoft\Windows\WER (para el resto).

Otra forma de generar manualmente un volcado pequeño de memoria (minidump) de un proceso en Windows Vista es, desde Administrador de tareas, pestaña Procesos, seleccionar el proceso en cuestión con el botón derecho del ratón y hacer clic sobre Crear archivo de volcado. El volcado tendrá el nombre del proceso, extensión .dmp, y estará en la carpeta de temporales del usuario: %LocalAppData%\Temp. El volcado lo genera Administrador de tareas con la ayuda de la DLL Dbghelp.dll del directorio de sistema.

4 comentarios:

Maru dijo...

Hola Dani, tengo un problemilla incómodo con Windows Vista.
De repente ha dejado de iniciar correctamente. Te explico:
Enciendo el ordenador, y todo va correctamente, selecciono el usuario, aparece el mensaje de iniciando.... y me aparece la pantalla en blanco.
El problema es que no me carga el explorador, con lo cual no me aparece la barra de tareas, ni los iconos, ni el fondo de escritorio, ni la sidebar.
Lo arreglo abriendo iexplorer, haciendo como que voy a guardar la pagina, y así accediendo al archivo explorer de la carpeta de windows.
Me pasa con todos los usuarios, administradores o no.
Como puedo solucionarlo?
Muchas gracias.

Daniel Martín dijo...

Este problema me parece interesante y me gustaría analizarlo con tu ayuda. Escríbeme a mardani29 at yahoo.es ("at" es el símbolo de arroba).

Anónimo dijo...

hola gente me pasa lo mismo que describes antes.. no inicia el explorer.exe ni puedo hacerlo de forma manual... e eliminado los posibles virus y ahora pasa lo mismo pero sin notificar ningun error... pero sigo sion poder entrar a w. vista, nisiquiera een modo "a prueba de fallos" ni de ninguna otra maneera.. agradezco informacion sino debere formaterar desde ya muchas gracias

Anónimo dijo...

酒店經紀PRETTY GIRL 台北酒店經紀人 ,酒店經紀 酒店兼差PRETTY GIRL酒店公關 酒店小姐 彩色爆米花酒店兼職,酒店工作 彩色爆米花禮服店, 酒店上班,酒店工作 PRETTY GIRL酒店喝酒酒店上班 彩色爆米花台北酒店酒店小姐 PRETTY GIRL酒店上班酒店打工PRETTY GIRL酒店打工酒店經紀 彩色爆米花