2008-09-16 6 views
8

En tant que personne qui commence tout juste à apprendre les subtilités du débogage de l'ordinateur, je n'arrive pas à comprendre comment lire le texte d'une décharge dans Windbg. Je ne sais pas par où commencer comment les interpréter ou comment s'y prendre. Quelqu'un peut-il offrir une direction à cette pauvre âme?Interprétation des piles dans Windows Minidumps

-à-dire (la seule décharge que j'ai sous la main avec moi en fait)

>b69dd8f0 bfa1e255 016d2fc0 89efc000 00000040 nv4_disp+0x48b94 

b69dd8f4 016d2fc0 89efc000 00000040 00000006 nv4_disp+0x49255 

b69dd8f8 89efc000 00000040 00000006 bfa1dcc0 0x16d2fc0 

b69dd8fc 00000000 00000006 bfa1dcc0 e1e71018 0x89efc000

Je sais que le problème est de faire avec le pilote d'affichage Nvidia, mais ce que je veux savoir est comment lire réellement la pile (par exemple, qu'est-ce que b69dd8f4?): - [

Répondre

18

D'abord, vous devez avoir les symboles appropriés configurés. Les symboles vous permettront de faire correspondre les adresses mémoire aux noms de fonction. Pour ce faire, vous devez créer un dossier local sur votre machine dans lequel vous allez stocker un cache local de symboles (par exemple: C: \ symbols). Ensuite, vous devez spécifier le chemin du serveur de symboles. Pour ce faire, il suffit d'aller à: Fichier> Symbole Chemin du fichier et tapez:

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

Vous pouvez trouver plus d'informations sur la façon de configurer correctement les symboles here. Une fois que vous avez correctement configuré le serveur de Symboles, vous pouvez ouvrir le minidump à partir de: Fichier> Ouvrir le vidage sur incident.

Une fois que le minidump est ouvert, il vous montrera sur le côté gauche de la ligne de commande le thread qui était en cours d'exécution lorsque le vidage a été généré. Si vous voulez voir ce que ce fil est le type d'exécution:

kpn 200 

Cela peut prendre un certain temps la première vous l'exécuter, car il doit télécharger les symboles liés Microsoft publics nécessaires pour la première fois.Une fois que tous les symboles sont téléchargés, vous obtiendrez quelque chose comme:

01 MODULE!CLASS.FUNCTIONNAME1(...) 
02 MODULE!CLASS.FUNCTIONNAME2(...) 
03 MODULE!CLASS.FUNCTIONNAME3(...) 
04 MODULE!CLASS.FUNCTIONNAME4(...) 

Où:

  • LE PREMIER NUMÉRO: Indique le numéro de cadre
  • MODULE: La DLL qui contient les code
  • CLASSE: (Uniquement sur le code C++) vous montrera la classe qui contient le code
  • FUNCTIONAME: La méthode appelée. Si vous avez les symboles corrects, vous verrez également les paramètres.

Vous pouvez également voir quelque chose comme

01 MODULE!+989823 

Cela indique que vous n'avez pas le bon symbole pour cette DLL et donc vous êtes en mesure de voir que le procédé offset.

Alors, qu'est-ce qu'une callstack?

Imaginez que vous avez ce code:

void main() 
{ 
    method1(); 
} 

void method1() 
{ 
    method2(); 
} 

int method2() 
{ 
    return 20/0; 
} 

Dans ce method2 code essentiellement jetteront une exception puisque nous essayons de diviser par 0 et cela entraînera le processus de plantage. Si nous avons eu un minidump quand cela se produisait, nous verrions la callstack suivante:

01 MYDLL!method2() 
02 MYDLL!method1() 
03 MYDLL!main() 

Vous pouvez suivre de cette callstack que « principal » appelé « method1 » qui a ensuite appelé « method2 » et il a échoué.

Dans votre cas, vous avez cette callstack (que je suppose est le résultat de l'exécution « kb » command)

b69dd8f0 bfa1e255 016d2fc0 89efc000 00000040 nv4_disp+0x48b94 
b69dd8f4 016d2fc0 89efc000 00000040 00000006 nv4_disp+0x49255 
b69dd8f8 89efc000 00000040 00000006 bfa1dcc0 0x16d2fc0 
b69dd8fc 00000000 00000006 bfa1dcc0 e1e71018 0x89efc000 

La première colonne indique le pointeur de cadre enfant, la deuxième colonne indique l'adresse de retour de la méthode qui s'exécute, les trois colonnes suivantes montrent les 3 premiers paramètres qui ont été passés à la méthode, et la dernière partie est le nom de la DLL (nv4_disp) et le décalage de la méthode en cours d'exécution (+ 0x48b94). Puisque vous n'avez pas les symboles, vous ne pouvez pas voir le nom de la méthode. Je doute que NVIDIA offre un accès public à leurs symboles, donc je pense que vous ne pouvez pas obtenir beaucoup d'informations d'ici.

Je vous recommande d'exécuter "kpn 200". Cela vous montrera la callstack complète et vous pourriez être en mesure de voir l'origine de la méthode qui a causé cet accident (s'il s'agissait d'une DLL Microsoft, vous devriez avoir les symboles appropriés dans les étapes que je vous ai fournies). Au moins, vous savez qu'il s'agit d'un bogue NVIDIA ;-) Essayez de mettre à niveau les DLL de ce pilote vers la dernière version.

Si vous voulez en savoir plus sur le débogage WinDBG Je recommande les liens suivants:

+1

Cette réponse est impressionnante. SO shouuld avoir plus de réponses comme ça. –

+0

Merci l'homme! M'aider beaucoup! – qweet

0

Il peut être utile d'inclure un exemple de la pile que vous essayez de lire. Une bonne astuce consiste à vous assurer que vous disposez des symboles de débogage corrects pour tous les modules affichés dans la pile. Cela inclut des symboles pour les modules dans le système d'exploitation, Microsoft a rendu leur serveur de symboles accessible au public.

3

Un très bon tutoriel sur l'interprétation d'une trace de la pile est disponible ici:

http://www.codeproject.com/KB/debug/cdbntsd2.aspx

Cependant, même avec un tutoriel comme il peut être très difficile (ou presque impossible) pour interpréter un vidage de pile sans les symboles appropriés disponibles/chargés.

Questions connexes