Depurando un crash de explorer.exe en Windows 8.1

Hace unos días mi explorador de Windows 8.1 empezó a fallar, teniendo cuelgues cada cierto tiempo que me llegaban a bloquear una buena parte del sistema, y que concluían con un reinicio automático del explorador. Lo curioso es que no era posible reproducirlo, así que, para intentar averiguar qué pasaba, me he armado de valor y me he propuesto depurarlo.

En este artículo veremos los diferentes pasos que he ido dando.

1. Generar un dump:

Para poder depurar primero tenemos, o bien que adjuntar un depurador a la aplicación y esperar a que falle, o bien generar un volcado de la memoria (dump) en el momento del fallo. Como explorer no lo realiza de manera automática, hemos de agregar al registro de windows la siguiente clave:

https://onedrive.live.com/?cid=128FC518635BE2DC&id=128FC518635BE2DC%21346

De esta manera, cuando ocurra el crash, no podremos evitarlo (en principio) pero sabremos donde mirar.

Cuando terminemos de recopilar logs, podemos restaurar el estado anterios, empleando una clave de registro similar:

https://onedrive.live.com/?cid=128FC518635BE2DC&id=128FC518635BE2DC%21672

2. Instalar el SDK de Windows:

El SDK de Windows (8.1 en mi caso) incluye los depuradores para 32 y 64 bits, y se instala por defecto en C:\Program Files (x86)\Windows Kits\Debuggers\x64 El depurador que usaremos es WinDbg.

Para descargar el sdk deberemos ir a http://msdn.microsoft.com/en-us/windows/hardware/hh852365

3. Cargamos el dump anteriormente generado

Si hemos tenido suerte y desde que lo instalamos hemos sufrido algún crash, podemos entonces analizarlo. Para ello vamos a la ruta anterior, ejecutamos WinDbg, vamos a «File > «Open Crash Dump» y seleccionamos nuestro fichero de dump (Que estará situado en la carpeta

explorer crash

4. Inicializar los servidores de símbolos

Abrimos «Symbol File Path…»

SRV*C:\WebSymbols*http://msdl.microsoft.com/download/symbols

Recargamos la lista de símbolos de nuestro dump usando el siguiente comando.

.reload

5. Iniciar análisis

Una vez que la lista de símbolos está cargada, solamente nos queda iniciar el análisis

!analyze -v

Una vez terminado el análisis (que va a tardar bastante) tendremos un resultado como este:


*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************

*** ERROR: Symbol file could not be found.  Defaulted to export symbols for sppc.dll - 

FAULTING_IP: 
comsvcs!CNewMonikerClassObject::ParseDisplayName+0
00007ff8`5ba62cf4 ??              ???

EXCEPTION_RECORD:  ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 00007ff878c01759 (ntdll!RtlVirtualUnwind+0x0000000000000091)
   ExceptionCode: c0000006 (In-page I/O error)
  ExceptionFlags: 00000000
NumberParameters: 3
   Parameter[0]: 0000000000000000
   Parameter[1]: 00007ff85ba62cf4
   Parameter[2]: 00000000c0000185
Inpage operation failed at 00007ff85ba62cf4, due to I/O error 00000000c0000185

CONTEXT:  0000000000000000 -- (.cxr 0x0;r)
rax=000000001282de78 rbx=00000000127b1570 rcx=0000000000000001
rdx=00007ff85b960000 rsi=0000000000000000 rdi=00007ff85ba62cf4
rip=00007ff878c01759 rsp=00000000127b1410 rbp=00007ff85ba91b5c
 r8=00007ff85ba62cf4  r9=00007ff85babab2c r10=0000000000000b99
r11=00007ff85b960000 r12=0000000000000000 r13=00000000127b14e8
r14=00007ff85babab2c r15=0000000000000001
iopl=0         nv up ei ng nz ac po cy
cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010297
ntdll!RtlVirtualUnwind+0x91:
00007ff8`78c01759 803f48          cmp     byte ptr [rdi],48h ds:00007ff8`5ba62cf4=??

DEFAULT_BUCKET_ID:  WRONG_SYMBOLS

PROCESS_NAME:  explorer.exe

ERROR_CODE: (NTSTATUS) 0xc0000006 - The instruction at 0x%p referenced memory at 0x%p. The required data was not placed into memory because of an I/O error status of 0x%x.

EXCEPTION_CODE: (NTSTATUS) 0xc0000006 - The instruction at 0x%p referenced memory at 0x%p. The required data was not placed into memory because of an I/O error status of 0x%x.

EXCEPTION_PARAMETER1:  0000000000000000

EXCEPTION_PARAMETER2:  00007ff85ba62cf4

EXCEPTION_PARAMETER3:  00000000c0000185

IO_ERROR: (NTSTATUS) 0xc0000185 - The I/O device reported an I/O error.

EXCEPTION_STR:  0xc0000006_c0000185

ADDITIONAL_DEBUG_TEXT:  Followup set based on attribute [Is_ChosenCrashFollowupThread] from Frame:[0] on thread:[PSEUDO_THREAD]

LAST_CONTROL_TRANSFER:  from 0000000000000000 to 0000000000000000

NTGLOBALFLAG:  0

APPLICATION_VERIFIER_FLAGS:  0

APP:  explorer.exe

ANALYSIS_VERSION: 6.3.9600.16384 (debuggers(dbg).130821-1623) amd64fre

MANAGED_STACK: !dumpstack -EE
OS Thread Id: 0x3eb4 (22)
Current frame: 
Child-SP         RetAddr          Caller, Callee

PRIMARY_PROBLEM_CLASS:  WRONG_SYMBOLS

BUGCHECK_STR:  APPLICATION_FAULT_WRONG_SYMBOLS

STACK_TEXT:  
00000000`00000000 00000000`00000000 hardware_disk!Unknown+0x0


STACK_COMMAND:  .ecxr ; kb ; ** Pseudo Context ** ; kb

SYMBOL_STACK_INDEX:  0

SYMBOL_NAME:  hardware_disk!Unknown

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: hardware_disk

DEBUG_FLR_IMAGE_TIMESTAMP:  0

FAILURE_BUCKET_ID:  WRONG_SYMBOLS_c0000006_hardware_disk!Unknown

BUCKET_ID:  APPLICATION_FAULT_WRONG_SYMBOLS_hardware_disk!Unknown

IMAGE_NAME:  hardware_disk

ANALYSIS_SOURCE:  UM

FAILURE_ID_HASH_STRING:  um:wrong_symbols_c0000006_hardware_disk!unknown

FAILURE_ID_HASH:  {95c4d6f5-b6a7-b83a-dfd6-d872fc207cf6}

Followup: MachineOwner
---------

Tras echar un vistazo al crash, y consultar por los rincones de Internet, parece ser que la clave está aquí: IO_ERROR: (NTSTATUS) 0xc0000185 – The I/O device reported an I/O error. Es decir, tengo algún tipo de error de disco. Tocará seguir investigando con otras herramientas. Aunque no he podido conseguir mi objetivo final (reducir o eliminar los fallos) usando windbg, he podido hacer un pequeño diagnóstico gracias a windbg.

Dejo abierta al lector la siguiente pregunta, qué tipo de problemas has podido resolver usando windbg o similar?

Sigue la conversación en Reddit

Repositorios para versiones antiguas de Ubuntu

Una cosa que nos puede ocurrir es que estemos trabajando en una solución basada en Ubuntu y que, por las razones que sean, no sea posible/viable su actualización.

El problema radica en que los repositorios que se emplean para actualizar los paquetes van cambiando con el tiempo, con lo cual si seguimos usando una versión antigua llegará el día en que no pueda acceder al mismo.

La solución pasa por editar el fichero /etc/apt/sources.list, y sustituir la dirección que tengamos por la siguiente:

http://old-releases.ubuntu.com/ubuntu/

.En el momento de la redacción de este artículo se encontraban disponibles repositorios hasta la versión 4.10 de Ubuntu.

Imagen: CrystalXP