Simplification de l'analyse des vidages mémoire Windows ou autre ajustement du menu contextuel

De nombreux utilisateurs de systèmes d'exploitation Windows, tôt ou tard, sont confrontés à la nécessité de savoir pourquoi leur système d'exploitation préféré "tombe dans le BSOD".

Beaucoup de choses ont déjà été écrites sur la façon de rechercher une cause et de la corriger (selon la situation) sur Internet, mais que dois-je faire si j'ai besoin de trouver la cause le plus rapidement possible et de le faire régulièrement, comme les techniciens ou les habitués des forums informatiques?



Les ajustements notoires du menu contextuel peuvent simplifier la tâche, car ils sont faits tout simplement.

La préparation
Vous devez d'abord installer le package avec le débogueur windbg.exe, la version console de kd.exe et d'autres contenus nécessaires.

Ce sont les packages X64 Debuggers And Tools-x64_en-us.msi ou X86 Debuggers And Tools-x86_en-us.msi à choisir en fonction de la profondeur de bits du système d'exploitation utilisé et / ou des préférences personnelles.

Vous ne trouverez pas de liens individuels sur le site Web de Microsoft, mais ces packages font partie du Kit de pilotes Windows , vous pouvez le télécharger sans l'installer en sélectionnant le mode d'installation approprié, les packages seront dans le dossier \ Windows Kits \ 10 \ WDK \ Installers une fois le téléchargement terminé.

Si quelqu'un en a besoin, je les ai téléchargés séparément sur I. Disque:

Débogueurs et outils X64-x64_en-us.msi
Débogueurs et outils X86-x86_en-us.msi

J'ai décidé de ne pas installer le débogueur, mais simplement de décompresser msi:

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

Cette option "portable" est plus que suffisante. Après, pour ma propre convenance, j'ai déplacé le contenu souhaité de plusieurs sous-dossiers vers C: \ Portable \ Debug , afin qu'il se révèle:

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


+ tout le reste. Nous allons continuer sur cette voie à l'avenir (et je l'ai ajouté à nouveau à% PATH%, pour plus de commodité).

À ce stade, les mesures préparatoires peuvent être considérées comme terminées et décrire ensuite le processus de création d'un ajustement.

Étant donné que ma tâche suppose qu'il existe de nombreux et souvent des vidages, j'ai besoin d'accélérer le processus autant que possible, tout en le rendant suffisamment informatif pour une analyse rapide.

Gestion des clés et des commandes du débogueur


Comme base pour le futur ajustement, prenons un tel fichier batch, sur lequel il suffit de faire glisser le vidage souhaité.

Pour une meilleure perception de l'information, à ma connaissance, j'ai inversé les couleurs de la console et défini la taille de la fenêtre de la console plus 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 

Ici, vous pouvez voir les paramètres transmis par kd.exe, tels que -y , -i et, en fait, -z , qui ont été vus par tous ceux qui connaissent kdfe.cmd, largement connus dans les cercles étroits.

 -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 nous le prenons par analogie avec des instructions communes, il y a de légères différences: -nosqm et -sup sont également passés comme arguments.

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

En équipes:

 !cpuid !sysinfo cpuinfo !sysinfo cpuspeed !sysinfo machineid 

Je ne les peindrai pas, car trop de copier-coller sortiront. Ceux qui sont intéressés pourront trouver l'aide détaillée de debugger.chm dans l'un des deux * .msi mentionnés ci-dessus ou sur docs.microsoft.com -cpuid -sysinfo . En bref, des informations de base sur la glande de la victime.

La sortie du script utilisant kd.exe se révélera être presque la même que celle qui aurait été obtenue en travaillant directement via windbg, mais le résultat est obtenu beaucoup plus rapidement car vous n'avez pas besoin d'ouvrir quoi que ce soit, de configurer des dossiers, d'ouvrir le vidage via le menu et d'entrer des commandes dans le débogueur.

Filtrer les déchets de la console


Pour le premier exemple, prenons un vidage de mémoire d'un utilisateur aléatoire. Il y a un petit problème avec les ordures dans la sortie:

Capture d'écran d'une sortie de console

Cela se trouve, par exemple, dans les vidages d'utilisateurs utilisant l'activateur odin, que nous voyons dans cet exemple.

La sortie complète est assez massive, en raison du lien vers pastebin .

Il est nécessaire de "filtrer" les lignes inutiles en ne laissant que des informations utiles.
J'ai utilisé findstr , il s'est avéré une solution si moche mais fonctionnelle:

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

Ici, findstr utilise deux réguliers: l'un recherche les lignes commençant par trois astérisques, un espace et se terminant par un espace et trois astérisques. La seconde recherche des lignes commençant par 14 étoiles. Je ne pourrais rien faire de plus intelligible avec findstr.

(Je ne recommande pas d'utiliser les fins de ligne dans les habitués de findstr sur l'échappement kd.exe, il peut y avoir des problèmes avec le type de fins de ligne affiché par kd.exe. Au lieu de \ r \ n, vous pouvez obtenir \ n que findstr ne considère pas les fins de ligne. Un tel râteau pour vous-même.)

Le code complet du fichier de commandes préliminaire avec le "filtre" s'est avéré être:

 @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 sortie complète de la version filtrée est également sur pastebin .

Le résultat est similaire, mais sans «poubelle». 290 lignes de texte contre 894. Déjà mieux, mais pas tous.

Création rapide du journal du débogueur


L'étape suivante consiste à ajouter un journal, qui pourrait être publié ou envoyé quelque part.

Pour ce faire, passez kd.exe l'argument -loga <"P: \ Ă  \ log.log">
Le code prend la forme suivante:

 @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 

Un journal 102516-21949-01.LOG sera généré pour le fichier 102516-21949-01.dmp dans le même dossier que le vidage lui-même.

Dans ce cas, la sortie de «garbage» dans le journal n'est pas filtrée, seule la sortie vers la console est filtrée, mais dans mon cas, ce n'est pas important, bien que vous puissiez le corriger en effaçant le journal après la création:

 @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 

Ouvrir un dépotoir dans windbg


Maintenant, dernière étape dans l'ordre, mais sans importance: vous devez pouvoir transférer le cliché directement vers windbg.exe et lui passer immédiatement des commandes que vous devrez probablement saisir. Tout se fait par analogie avec kd.exe, les arguments et commandes reçus par windbg.exe sont presque identiques à 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 

En conséquence, le vidage s'ouvrira immédiatement dans le débogueur et les commandes répertoriées dans la clé -c seront automatiquement exécutées dans celui-ci.

La conclusion est similaire à la toute première option à la différence que le vidage est ouvert immédiatement dans windbg, il est possible d'entrer des commandes pour une analyse plus approfondie en raison de l'absence de la commande q dans la liste des commandes transmises.

(Par ailleurs, si dans les versions précédentes du script avec kd.exe vous supprimez la commande q qui est passée dans la liste des commandes via l'argument -c , la possibilité de continuer à travailler avec le vidage y apparaîtra, y compris l'enregistrement du journal directement dans le processus.)

Tweak Creation


Maintenant, tout cela doit être modifié afin que vous puissiez lier les fichiers * .dmp au menu contextuel. En fait, pour ce que c'était.

Voici les «one-liners» suivants:

Pour l'option avec filtrage de sortie 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:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" 

Pour l'option avec filtrage de la sortie de la console et création d'un fichier journal
(a dû utiliser une extension de variable différée )

 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:"^\*\*\*\*\*\*\*\*\*\*\*\*\*\*.*" 

Pour ouvrir un vidage directement dans 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" 

Dans le registre, j'ai créé la structure de partition suivante:



Un type distinct de fichier dmp_geek a été créé dans les clés de registre dont les modifications ont été apportées. Les fichiers portant l'extension * .dmp se sont vu attribuer des fichiers de type dmp_geek .

Dans chaque section de commande, la ligne unique + la beauté sous la forme d'icônes et de noms pratiques pour les noms d'éléments affichés dans le menu contextuel ont été ajoutés au paramètre de chaîne par défaut.



Il s'est avéré un ajustement qui ajoute la possibilité d'ouvrir massivement les vidages sélectionnés dans le dossier à la fois dans la console et dans le débogueur avec filtrage des «ordures» et création de journaux pour chaque vidage si nécessaire. Cela fait gagner beaucoup de temps.

Après avoir peigné le registre, tout exporté dans le fichier REG final prêt à l'emploi.

Le contenu du fichier 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\"" 

→ Télécharger depuis Ya.Disk GEEK_DMP.reg

C’est tout. Maintenant, vous pouvez rapidement, mais superficiellement, analyser immédiatement un tas de décharges.

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


All Articles