Simplificación del análisis de volcados de memoria de Windows u otro ajuste del menú contextual

Muchos usuarios de sistemas operativos Windows, tarde o temprano, se enfrentan a la necesidad de descubrir por qué su sistema operativo favorito "cae en BSOD".

Ya se ha escrito mucho sobre cómo buscar una causa y cómo solucionarla (dependiendo de la situación) en Internet, pero ¿qué debo hacer si necesito encontrar la causa lo más rápido posible y tengo que hacerlo regularmente, como trabajadores de servicio o clientes habituales en foros de computadoras?



Los ajustes notorios del menú contextual pueden simplificar la tarea, ya que se realizan de manera bastante simple.

Preparación
Primero debe instalar el paquete con el depurador windbg.exe, la versión de consola de kd.exe y otros contenidos necesarios.

Estos son los paquetes X64 Debuggers And Tools-x64_en-us.msi o X86 Debuggers And Tools-x86_en-us.msi para elegir según la profundidad de bits del sistema operativo utilizado y / o las preferencias personales.

No encontrará enlaces individuales en el sitio web de Microsoft, pero estos paquetes son parte del Kit de controladores de Windows , puede descargarlo sin instalarlo seleccionando el modo de instalador apropiado, los paquetes estarán en la carpeta \ Windows Kits \ 10 \ WDK \ Installer cuando se complete la descarga.

Si alguien lo necesita, los cargué por separado en I. Disco:

Depuradores y herramientas X64-x64_en-us.msi
Depuradores y herramientas X86-x86_en-us.msi

Decidí no instalar el depurador, pero simplemente descomprimir msi:

msiexec /a "D:\Desktop\X64 Debuggers And Tools-x64_en-us.msi" /qb targetdir="D:\Desktop\Temp" 

Esta opción "portátil" es más que suficiente. Después, para mi conveniencia, moví el contenido deseado de varias subcarpetas a C: \ Portable \ Debug , para que resulte :

C:\Portable\Debug\windbg.exe
C:\Portable\Debug\kd.exe


+ todo lo demás. Desarrollaremos este camino en el futuro (además lo agregué a% PATH% nuevamente, por conveniencia).

En este momento, las medidas preparatorias pueden considerarse completadas y seguir describiendo el proceso de creación de un ajuste.

Dado que mi tarea supone que hay muchos y, a menudo, volcados, necesito acelerar el proceso tanto como sea posible, mientras lo hago lo suficientemente informativo para un análisis rápido.

Manejo de claves y comandos del depurador


Como base para el ajuste futuro, tomemos dicho archivo por lotes, en el que es suficiente para arrastrar el volcado deseado.

Para una mejor percepción de la información, en mi opinión, invertí los colores de la consola y configuré el tamaño de la ventana de la consola más grande.

 @echo off title text %1 mode con: cols=170 color F0 title "%1" kd.exe -nosqm -sup -z "%1" ^ -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -c ^ "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q"" pause exit /b 

Aquí puede ver los parámetros transmitidos por kd.exe, como -y , -i y, de hecho, -z , que fueron vistos por todos los que conocen kdfe.cmd, ampliamente conocidos en círculos estrechos.

 -i !ImagePath! specifies the location of the executables that generated the fault (see _NT_EXECUTABLE_IMAGE_PATH) -y !SymbolsPath! specifies the symbol search path (see _NT_SYMBOL_PATH) -z !CrashDmpFile! specifies the name of a crash dump file to debug 

Si lo tomamos por analogía con instrucciones comunes, hay ligeras diferencias: -nosqm y -sup se pasan adicionalmente como argumentos.

 -nosqm disables SQM data collection/upload. -sup enables full public symbol searches 

Como equipos:

 !cpuid !sysinfo cpuinfo !sysinfo cpuspeed !sysinfo machineid 

No los pintaré, porque saldrán demasiados copiar y pegar. Quienes estén interesados ​​podrán encontrar la ayuda detallada de debugger.chm en cualquiera de los dos * .msi mencionados anteriormente o en docs.microsoft.com -cpuid -sysinfo . En resumen, información básica sobre la glándula de la víctima.

La salida del script usando kd.exe resultará ser casi la misma que se habría obtenido al trabajar directamente a través de windbg, pero el resultado se logra mucho más rápido ya que no necesita abrir nada, configurar carpetas, abrir el volcado a través del menú e ingresar comandos en el depurador.

Filtrando la salida de basura de la consola


Para el primer ejemplo, tomemos un volcado de memoria de un usuario aleatorio. Hay un pequeño problema con la basura en la salida:

Captura de pantalla de una salida de consola

Esto se encuentra, por ejemplo, en vertederos de usuarios que usan el activador odin, que vemos en este ejemplo.

La salida completa es bastante masiva, debido al enlace a pastebin .

Es necesario "filtrar" las líneas innecesarias dejando solo información útil.
Usé FindStr , resultó una solución tan fea pero funcional:

 findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" 

Aquí findtr usa dos regulares: uno busca líneas que comienzan con tres asteriscos, un espacio y terminan con un espacio y tres asteriscos. El segundo busca líneas que comienzan con 14 estrellas. No podría hacer nada más inteligible con FindStr.

(No recomiendo usar terminaciones de línea en los regulares de findtr en el escape de kd.exe, puede haber problemas con el tipo de terminaciones de línea que muestra kd.exe. En lugar de \ r \ n, puede obtener \ n que findtr no considera las terminaciones de línea.

El código completo del archivo por lotes preliminar con el "filtro" resultó ser el siguiente:

 @echo off title text %1 mode con: cols=170 color F0 title "%1" kd.exe -nosqm -sup -z "%1" ^ -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols ^ -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" pause exit /b 

La salida completa de la versión filtrada también está en pastebin .

El resultado es similar, pero sin "basura". 290 líneas de texto versus 894. Ya mejor, pero no todos.

Creación rápida de registro de depurador


El siguiente paso es agregar un registro, que podría publicarse o enviarse a alguna parte.

Para hacer esto, pase kd.exe el argumento -loga <"P: \ to the \ log.log">
El código toma la siguiente forma:

 @echo off title text %1 mode con: cols=170 color F0 title "%1" set "D=%1" set L=%D:.dmp=.LOG% kd.exe -nosqm -sup -loga "%L%" -z "%D%" ^ -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols ^ -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" pause exit /b 

Se generará un registro 102516-21949-01.LOG para el archivo 102516-21949-01.dmp en la misma carpeta que el volcado en sí.

En este caso, la salida de "basura" al registro no se filtra, solo se filtra la salida a la consola, pero en mi caso esto no es importante, aunque puede solucionarlo borrando el registro después de la creación:

 @echo off title text %1 mode con: cols=170 color F0 title "%1" set "D=%1" set L=%D:.dmp=.LOG% kd.exe -nosqm -sup -loga "%L%" -z "%D%" ^ -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols ^ -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" set CL=%L:.LOG=_CLEAN.LOG% type "%L%" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" >> "%CL%" del /f /q "%L%" pause exit /b 

Abrir un basurero en windbg


Ahora, el último paso en orden, pero no en importancia: debe poder transferir el volcado directamente a windbg.exe e inmediatamente pasarle comandos que probablemente necesitará ingresar. Todo se hace por analogía con kd.exe, los argumentos y comandos recibidos por windbg.exe son casi idénticos a kd.exe

 @echo off windbg.exe -z "%1" -sup -y ^ "srv*C:\Symbols*http://msdl.microsoft.com/download/symbols" -i "srv*C:\Symbols*http://msdl.microsoft.com/download/symbols" -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid" exit /b 

Como resultado, el volcado se abrirá inmediatamente en el depurador y los comandos enumerados en la tecla -c se ejecutarán automáticamente en él.

La conclusión es similar a la primera opción con la diferencia de que el volcado se abre inmediatamente en windbg, es posible ingresar comandos para un análisis posterior debido a la ausencia del comando q en la lista de comandos transmitidos.

(Por cierto, si en las versiones anteriores de la secuencia de comandos con kd.exe elimina el comando q que se pasa en la lista de comandos a través del argumento -c , la capacidad de continuar trabajando con el volcado aparecerá allí, incluida la grabación del registro directamente en el proceso).

Tweak Creation


Ahora, todo esto debe modificarse para que pueda vincular archivos * .dmp al menú contextual. En realidad, por lo que estaba haciendo.

Aquí están los siguientes "one-liners":

Para la opción con filtrado de salida de consola

 cmd /d /k mode con: cols=170 & color F0 & title "%1" & kd.exe -nosqm -sup -z "%1" -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" 

Para la opción de filtrar la salida de la consola y crear un archivo de registro
(tuvo que usar una extensión variable diferida )

 cmd /d /v /k mode con: cols=170 & color F0 & title "%1" & set "D=%1"& set L=!D:.dmp=.LOG! & kd.exe -nosqm -sup -loga "!L!" -z "!D!" -y srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -i srv*"C:\Symbols"*http://msdl.microsoft.com/download/symbols -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q" | findstr /r /v /c:"^\*\*\* .* \*\*\*" /c:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" 

Para abrir un volcado directamente en windbg.exe

 "C:\Portable\Debug\windbg.exe" -z "%1" -sup -y "srv*C:\Symbols*http://msdl.microsoft.com/download/symbols" -i "srv*C:\Symbols*http://msdl.microsoft.com/download/symbols" -c "!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid" 

En el registro, creé la siguiente estructura de partición:



Se creó un tipo separado de archivo dmp_geek en las claves de registro cuyos cambios se realizaron. A los archivos con la extensión * .dmp se les han asignado archivos del tipo dmp_geek .

En cada sección de comando, la correspondiente línea única + belleza en forma de iconos y nombres convenientes para los nombres de elementos mostrados en el menú contextual se agregaron al parámetro de cadena de forma predeterminada.



Resultó un ajuste que agrega la capacidad de abrir masivamente los volcados seleccionados en la carpeta tanto en la consola como en el depurador con el filtrado de "basura" y creando registros para cada volcado según sea necesario. Ahorra mucho tiempo.

Después de peinar el registro, exportó todo al archivo REG final listo para usar.

El contenido del archivo REG
 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.dmp] @="dmp_geek" [HKEY_CLASSES_ROOT\dmp_geek] @="dmp_geek" "FriendlyTypeName"=" " [HKEY_CLASSES_ROOT\dmp_geek\DefaultIcon] @="imageres.dll,142" [HKEY_CLASSES_ROOT\dmp_geek\shell] [HKEY_CLASSES_ROOT\dmp_geek\shell\kd.exe] "MUIVerb"="Kd.exe" "Icon"="C:\\Portable\\Debug\\windbg.exe,6" [HKEY_CLASSES_ROOT\dmp_geek\shell\kd.exe\command] @="cmd /d /k mode con: cols=170 & color F0 & title \"%1\" & \"C:\\Portable\\Debug\\kd.exe\" -nosqm -sup -z \"%1\" -y srv*\"C:\\Symbols\"*http://msdl.microsoft.com/download/symbols -i srv*\"C:\\Symbols\"*http://msdl.microsoft.com/download/symbols -c \"!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q\" | findstr /r /v /c:\"^\\*\\*\\* .* \\*\\*\\*\" /c:\"^\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*.*\"" [HKEY_CLASSES_ROOT\dmp_geek\shell\kd.exe_-loga] "MUIVerb"="Kd.exe -loga" "Icon"="C:\\Portable\\Debug\\windbg.exe,6" [HKEY_CLASSES_ROOT\dmp_geek\shell\kd.exe_-loga\command] @="cmd /d /v /k mode con: cols=170 & color F0 & title \"%1\" & set \"D=%1\"& set L=!D:.dmp=.LOG! & \"C:\\Portable\\Debug\\kd.exe\" -nosqm -sup -loga \"!L!\" -z \"!D!\" -y srv*\"C:\\Symbols\"*http://msdl.microsoft.com/download/symbols -i srv*\"C:\\Symbols\"*http://msdl.microsoft.com/download/symbols -c \"!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid; q\" | findstr /r /v /c:\"^\\*\\*\\* .* \\*\\*\\*\" /c:\"^\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*\\*.*\"" [HKEY_CLASSES_ROOT\dmp_geek\shell\Open] "MUIVerb"="Windbg" "Icon"="C:\\Portable\\Debug\\windbg.exe,6" [HKEY_CLASSES_ROOT\dmp_geek\shell\Open\command] @="\"C:\\Portable\\Debug\\windbg.exe\" -z \"%1\" -sup -y \"srv*C:\\Symbols*http://msdl.microsoft.com/download/symbols\" -i \"srv*C:\\Symbols*http://msdl.microsoft.com/download/symbols\" -c \"!analyze -v; !cpuid; !sysinfo cpuinfo; !sysinfo cpuspeed; !sysinfo machineid\"" 

→ Descargar desde Ya.Disk GEEK_DMP.reg

Eso es todo Ahora puede analizar de forma rápida, aunque superficial, de inmediato un montón de vertederos.

Source: https://habr.com/ru/post/es409397/


All Articles