Simplificação da análise de despejos de memória do Windows ou Outro ajuste no menu de contexto

Muitos usuários de sistemas operacionais Windows, mais cedo ou mais tarde, são confrontados com a necessidade de descobrir por que seu sistema operacional favorito "cai no BSOD".

Muito já foi escrito sobre como procurar uma causa e como corrigi-la (dependendo da situação) na Internet, mas o que devo fazer se precisar descobrir a causa o mais rápido possível e precisar fazê-lo regularmente, como prestadores de serviços ou clientes regulares em fóruns de computador?



Os ajustes notórios do menu de contexto podem simplificar a tarefa, uma vez que são feitos de maneira bastante simples.

Preparação
Primeiro, você precisa instalar o pacote com o depurador windbg.exe, a versão do console do kd.exe e outros conteúdos necessários.

Estes são os pacotes X64 Debuggers And Tools-x64_en-us.msi ou X86 Debuggers And Tools-x86_en-us.msi para escolher, dependendo da profundidade de bits do sistema operacional usado e / ou das preferências pessoais.

Você não encontrará links individuais no site da microsoft, mas esses pacotes fazem parte do Windows Driver Kit , você pode baixá-lo sem instalá-lo selecionando o modo de instalador apropriado; os pacotes estarão na pasta \ Windows Kits \ 10 \ WDK \ Installers quando o download for concluído.

Se alguém precisar, enviei-os separadamente para I. Disco:

Depuradores X64 e ferramentas-x64_en-us.msi
Depuradores X86 e ferramentas-x86_en-us.msi

Decidi não instalar o depurador, mas apenas descompacte o msi:

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

Esta opção "portátil" é mais do que suficiente. Depois, para minha própria conveniência, mudei o conteúdo desejado de várias subpastas para C: \ Portable \ Debug , para que ocorra :

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


+ tudo o resto. Vamos desenvolver esse caminho no futuro (mais eu o adicionei ao% PATH% novamente, por conveniência).

Nesse sentido, as medidas preparatórias podem ser consideradas concluídas e continuar a descrever o processo de criação de ajustes.

Como minha tarefa pressupõe que existem muitas e muitas vezes despejos, preciso acelerar o processo o máximo possível, tornando-o informativo o suficiente para uma análise rápida.

Lidando com chaves e comandos do depurador


Como base para o futuro ajuste, vamos usar um arquivo em lote, no qual basta arrastar o dump desejado.

Para uma melhor percepção das informações, no meu entendimento, inverti as cores do console e ajustei o tamanho da janela do console.

 @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 

Aqui você pode ver os parâmetros transmitidos pelo kd.exe, como -y , -i e, de fato, -z , vistos por todos que conhecem o kdfe.cmd, amplamente conhecidos em círculos estreitos.

 -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 

Se considerarmos por analogia as instruções comuns, há pequenas diferenças: -nosqm e -sup são passados ​​adicionalmente como argumentos.

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

Como equipes:

 !cpuid !sysinfo cpuinfo !sysinfo cpuspeed !sysinfo machineid 

Não vou pintá-los, porque muitas cópias e colas serão exibidas. Os interessados ​​poderão encontrar a ajuda detalhada do debugger.chm em um dos dois * .msi mencionados acima ou em docs.microsoft.com -cpuid -sysinfo . Em resumo, informações básicas sobre a glândula da vítima.

A saída do script usando o kd.exe será quase a mesma que seria obtida ao trabalhar diretamente através do windbg, mas o resultado é alcançado muito mais rapidamente, pois você não precisa abrir nada, configurar pastas, abrir o dump no menu e inserir comandos no depurador.

Filtrando a Saída de Lixo do Console


Para o primeiro exemplo, vamos fazer um despejo de memória de um usuário aleatório. Há um pequeno problema com o lixo na saída:

Captura de tela de uma parte da saída do console

Isso é encontrado, por exemplo, em despejos de usuários usando o ativador odin, que vemos neste exemplo.

A saída completa é bastante massiva, por causa do link para pastebin .

É necessário "filtrar" linhas desnecessárias, deixando apenas informações úteis.
Eu usei o findstr , resultou em uma solução tão feia, mas funcional:

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

Aqui, o findstr usa dois regulares: um procura por linhas começando com três asteriscos, um espaço e terminando com um espaço e três asteriscos. O segundo procura por linhas começando com 14 estrelas. Eu não poderia fazer nada mais inteligível com o findstr.

(Eu não recomendo o uso de caracteres de terminação de linha nas rotinas findst no escape kd.exe, pode haver problemas com o tipo de final de linha exibido pelo kd.exe. Em vez de \ r \ n, você pode obter \ n que o findstr não considera o fim da linha.

O código inteiro do arquivo de lote preliminar com o "filtro" acabou sendo:

 @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 

A saída completa da versão filtrada também está no pastebin .

O resultado é semelhante, mas sem "lixo". 290 linhas de texto versus 894. Já é melhor, mas não todos.

Criação rápida de log do depurador


O próximo passo é adicionar um log, que pode ser postado ou enviado em algum lugar.

Para isso, passe ao kd.exe o argumento -loga <"P: \ to the \ log.log">
O código tem o seguinte formato:

 @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 

Um log 102516-21949-01.LOG será gerado para o arquivo 102516-21949-01.dmp na mesma pasta que o próprio dump.

Nesse caso, a saída de "lixo" para o log não é filtrada, apenas a saída para o console é filtrada, mas no meu caso isso não é importante, embora você possa corrigi-lo limpando o log após a criação:

 @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 

Abrindo um despejo no windbg


Agora, o último passo em ordem, mas não em importância: você precisa transferir o dump diretamente para windbg.exe e passar imediatamente comandos para ele que você provavelmente precisará inserir. Tudo é feito por analogia com o kd.exe, os argumentos e comandos recebidos pelo windbg.exe são quase idênticos ao 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, o dump será aberto imediatamente no depurador e os comandos listados na chave -c serão executados automaticamente nele.

A conclusão é semelhante à primeira opção, com a diferença de que o dump é aberto imediatamente no windbg; é possível inserir comandos para análises posteriores devido à ausência do comando q na lista de comandos transmitidos.

(A propósito, se nas versões anteriores do script com kd.exe você remover o comando q que é passado na lista de comandos pelo argumento -c , a capacidade de continuar trabalhando com o dump aparecerá lá, incluindo a gravação do log diretamente no processo.)

Tweak Creation


Agora tudo isso precisa ser modificado para que você possa vincular arquivos * .dmp ao menu de contexto. Na verdade, pelo que estava fazendo.

Aqui estão os seguintes "one-liners":

Para a opção com filtragem de saída do console

 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 a opção de filtrar a saída do console e criar um arquivo de log
(teve que usar uma extensão variável adiada )

 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 um despejo diretamente no 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" 

No registro, criei a seguinte estrutura de partição:



Um tipo separado de arquivo dmp_geek foi criado nas chaves do registro cujas alterações foram feitas. Arquivos com a extensão * .dmp receberam arquivos do tipo dmp_geek .

Em cada seção de comando, a linha única + beleza correspondente na forma de ícones e nomes convenientes para os nomes de itens exibidos no menu de contexto foram adicionados ao parâmetro de string por padrão.



O resultado foi um ajuste que adiciona a capacidade de abrir massivamente os dumps selecionados na pasta no console e no depurador, com filtragem de “lixo” e criação de logs para cada dump, conforme necessário. Isso economiza muito tempo.

Depois de vasculhar o registro, exportou tudo para o arquivo REG final, pronto para uso.

O conteúdo do arquivo 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\"" 

→ Faça o download do Ya.Disk GEEK_DMP.reg

Isso é tudo. Agora você pode rapidamente, embora superficialmente, analisar imediatamente um monte de lixões.

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


All Articles