web-dev-qa-db-fra.com

Comment utiliser WinDbg pour analyser le vidage sur incident pour l'application VC ++?

Comment utiliser WinDbg pour analyser un fichier de vidage?

42
Haranadh

Voici quelques étapes générales qui vous permettront de progresser:

Tout d'abord, vous devez modifier les paramètres de votre compilateur afin qu'il crée des fichiers PDB, même pour les versions. Les versions ultérieures du compilateur Visual C++ le font par défaut, mais dans de nombreuses versions de Visual C++, vous devez le faire vous-même. Créez des fichiers de base de données de programme, puis conservez une archive de ces fichiers avec chaque génération de votre application. Il est essentiel que chaque génération de vos applications dispose de son propre ensemble de PDB. Vous ne pouvez pas simplement réutiliser les mêmes que ceux que vous avez créés avec la build 10 pour examiner les vidages générés par la build 15, par exemple. Au cours de la vie de votre projet, vous vous retrouverez avec une tonne de PDB, alors soyez prêt pour cela.

Ensuite, vous devez être en mesure d'identifier la version exacte de votre application qui a généré le fichier de vidage. Si vous créez vos propres MiniDumps (en appelant MiniDumpWriteDump () par exemple), la façon la plus simple de le faire est probablement de faire simplement partie du nom de fichier du MiniDump le numéro de version complet de votre application. Vous aurez besoin d'un schéma de numérotation de version raisonnable pour que cela fonctionne. Dans ma boutique, nous incrémentons le numéro de build dans toutes les branches d'une fois à chaque fois que le constructeur automatique crée une build.

Maintenant que vous avez reçu le fichier de vidage du client, vous connaissez la version précise de l'application qui a créé le vidage et vous avez trouvé les fichiers PDB pour cette génération.

Vous devez maintenant parcourir l'historique de votre contrôle de code source et trouver le code source de cette version exacte du logiciel. La meilleure façon de procéder consiste à appliquer des "étiquettes" à vos branches chaque fois que vous effectuez une construction. Définissez la valeur de l'étiquette sur le numéro de version exact, et cela devient facile à trouver dans l'historique.

Vous êtes presque prêt à lancer WinDbg/Visual C++:

  1. Obtenez l'arborescence source complète pour cette version de votre application. Placez-le dans un endroit séparé sur votre disque dur, dites c:\app_build_1.0.100 pour l'application version 1.0 build # 100.
  2. Obtenez les fichiers binaires pour cette version exacte de votre application et placez-les quelque part sur votre disque dur. Il peut être plus simple d'installer simplement cette version de votre application pour obtenir les binaires.
  3. Placez les fichiers PDB au même emplacement que les fichiers binaires à l'étape 2.

Vous disposez maintenant de deux options pour afficher le fichier de vidage. Vous pouvez utiliser Visual Studio ou WinDbg. L'utilisation de Visual Studio est plus facile, mais WinDbg est beaucoup plus puissant. La plupart du temps, les fonctionnalités de Visual Studio suffisent.

Pour utiliser Visual Studio, il vous suffit d'ouvrir le fichier de vidage comme s'il s'agissait d'un projet. Une fois ouvert, "exécutez" le fichier de vidage (F5 par défaut) et si tous les chemins sont définis correctement, vous serez dirigé directement vers le code qui s'est écrasé, vous aurez une pile d'appels, etc.

Pour utiliser WinDbg, vous devez sauter à travers quelques cerceaux:

  1. Démarrez WinDbg
  2. Ouvrez le fichier de vidage. (Ctrl + D par défaut)
  3. Dites à WinDbg d'aller chercher les bons fichiers de symboles Microsoft. Tapez .symfix. Cela peut prendre quelques instants car cela entraînera une tonne de choses sur Internet.
  4. Indiquez à WinDbg où se trouvent les symboles (fichiers PDB). Tapez .sympath+ c:\pdblocation, en remplaçant où vous placez les fichiers PDB pour le chemin d'accès. Assurez-vous d'obtenir le signe plus sans espace entre .sympath et le + signe, sinon vous bousillerez l'étape 3.
  5. Dites à WinDbg où se trouve le code source. Tapez .srcpath c:\app_build_1.0.100 en remplaçant le chemin où vous avez obtenu le code du contrôle de code source par cette version du logiciel.
  6. Dites à WinDbg d'analyser le fichier de vidage. Tapez !analyze -v

Après quelques instants, si tout est correctement configuré, WinDbg vous amènera directement à l'emplacement de votre crash. À ce stade, vous avez un million d'options pour creuser profondément dans l'espace mémoire de votre application, l'état des sections critiques, des fenêtres, etc. Mais c'est bien au-delà la portée de ce poste.

Bonne chance!

69
John Dibling

(voir les sections "Dump" ci-dessous)

Tutoriels de base et démonstrations de l'utilisation de WinDbg

Différentes façons de "démarrer"/attacher WinDBG

Espaces de travail

Comprendre le fonctionnement des espaces de travail ...

Cmdtree

Un "cmdtree" vous permet de définir un "menu" de commandes de débogage pour un accès facile aux commandes fréquemment utilisées sans avoir à se rappeler les noms des commandes laconiques.

Vous n'avez pas besoin de mettre toutes les définitions de commandes dans le même fichier texte cmdtree .... vous pouvez les garder séparées et en charger plusieurs si vous le souhaitez (elles obtiennent alors leur propre fenêtre).

Script de démarrage

Vous pouvez utiliser l'option -c sur la ligne de commande pour exécuter automatiquement un script WinDBG lorsque vous démarrez WinDBG.

Donne la possibilité d'activer le mode DML (langage de balisage du débogueur), de charger des extensions particulières, de définir des points d'arrêt d'exception .NET, de définir des indicateurs de noyau (par exemple, lors du débogage du noyau, vous devrez peut-être modifier le masque DbgPrint pour voir les informations de suivi .... ed nt ! Kd_DEFAULT_Mask 0xffffffff), charger les cmdtrees, etc.

Un exemple de script:

$$ Include a directory to search for extensions
$$ (point to a source controlled or UNC common directory so that all developers get access)
.extpath+"c:\svn\DevTools\WinDBG\Extensions"
$$ When debugging a driver written with the Windows Driver Framework/KMDF
$$ load this extension that comes from the WinDDK.
!load C:\WinDDK\7600.16385.1\bin\x86\wdfkd.dll
!wdftmffile C:\WinDDK\7600.16385.1\tools\tracing\i386\wdf01009.tmf
$$ load some extensions
.load msec.dll
.load byakugan.dll
.load odbgext.dll
.load sosex
.load psscor4
$$ Make commands that support DML (Debugger Markup Language) use it
.prefer_dml 1
.dml_start
$$ Show NTSTATUS codes in hex by default
.enable_long_status 1
$$ Set default extension
.setdll psscor4
$$ Show all loaded extensions
.chain /D
$$ Load some command trees
.cmdtree c:\svn\DevTools\WinDBG\cmdtree\cmdtree1.txt
.cmdtree c:\svn\DevTools\WinDBG\cmdtree\cmdtree2.txt
$$ Show some help for the extensions
!wdfkd.help
!psscor4.help
.help /D

Feuilles de triche de commande

Extensions

Les "extensions" vous permettent d'étendre la gamme de commandes/fonctionnalités prises en charge dans WinDBG.

Écrivez votre propre extension

Utilisation de WinDBG pour déboguer du code managé

Script (C #, PS, Python, WinDBG)

Débogueurs/outils qui utilisent l'API dbgeng.dll/outils WinDBG

Différentes façons de générer des fichiers de vidage sur incident pour l'analyse post-mortem

Outils d'analyse de vidage

  • BlueScreenView - trouve les fichiers minidump .dmp enregistrés par Windows après un BSOD et extrait des informations sur la cause du crash
  • Debug.Analyzer (peut analyser les fichiers de vidage et les plug-ins peuvent être écrits en .NET)
  • SAD - Simple After Dump (analyseur post mortem)
  • Volatilité - framework pour analyser la "mémoire" enregistrée dans les fichiers de vidage ( aide-mémoire )

Outils liés au vidage

  • Citrix dumpcheck - vérifie la cohérence du fichier de vidage (on dirait qu'il a été abandonné link + link )
  • dumpchk (partie des outils de débogage) - vérifie la cohérence d'un fichier de vidage
  • MoonSols Windows Memory Toolkit (anciennement windd ) - convertit divers fichiers de vidage de mémoire brute en fichiers dmp compatibles WinDBG
  • vm2dmp - Microsoft Hyper-V VM State to Memory Dump Converter
  • vmss2core - convertit le fichier d'instantané VMWare en un fichier de vidage principal ( téléchargement ), ( instructions )

Débogage des machines virtuelles du noyau

Vidéos

Blogs

Certains blogs (mélange de débogage de code natif et géré).

Articles avancés et ressources didactiques

Débogueurs alternatifs

Autres liens

34
Colin Smith

C'est une question vraiment large.

  1. La première étape consiste à charger le fichier de vidage dans une instance WinDbg.
  2. Ensuite, vous devez vous assurer d'avoir une configuration de symboles.
  3. Enfin, vous pouvez exécuter la commande !analyze -v pour y effectuer une analyse de base. Vous devez disposer d'informations sur les symboles pour votre code pour que les fichiers de vidage en valent la peine.

Le site Web vidage de la mémoire, trace de logiciel, débogage, logiciel malveillant, portail Victimware et Intelligence Intelligence a été très informatif pour moi. J'ai aussi beaucoup apprécié le livre, Advanced Windows Debugging de Mario Hewardt et Daniel Pravat.

5
LanceSc

Tess Ferrandez a n grand ensemble de tutoriels de base et de laboratoires pour commencer avec Windbg. Je les recommande vivement.

3
womp