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:
Cette réponse est impressionnante. SO shouuld avoir plus de réponses comme ça. –
Merci l'homme! M'aider beaucoup! – qweet