Je sais que lorsqu'une application plante, lele système signale qu'il s'est écrasé à l'emplacement 0x00004b79 dans mydll.dll. J'ai le code source, et j'ai le binaire, mais je n'ai pas de PDB ou de fichiers de liste de la construction de cette DLL.
Le plantage est répétable, mais je ne peux pas installer undébogueur sur la machine de production, et le plantage ne se produit pas dans les environnements de développement ou de débogage. J'ai configuré Dr. Watson, et j'ai un vidage sur incident et un fichier journal Dr. Watson.
Le fichier journal Dr. Watson contient ce désassemblage pour la fonction en cours d'exécution:
10604b70 8b442408 mov eax,[esp+0x8]
10604b74 8b542404 mov edx,[esp+0x4]
10604b78 50 push eax
FAULT ->10604b79 8b4120 mov eax,[ecx+0x20] ds:0023:00000020=????????
10604b7c 52 push edx
10604b7d 6801800000 push 0x8001
10604b82 50 push eax
10604b83 ff156c946210 call dword ptr [mydll!DllUnregisterServer+0x1720c (1062946c)]
10604b89 c20800 ret 0x8
(Les instructions INT 3 précèdent et succèdent l'extrait d'assemblage ci-dessus.)
La trace de pile inclut uniquement l'adresse mydll + 0x4b79. Il ne donne aucune information sur l'appelant.
Le chargement du vidage sur incident dans windbg n'a fourni aucune information supplémentaire.
Comment puis-je déterminer dans quelle fonction (ou mieux encore, dans quelle ligne de code) le crash s'est produit?
Réponses:
2 pour la réponse № 1Créez un vidage sur incident de votre application et examinez-le à l'aide d'un débogueur, WinDbg est le choix évident ici. Un vidage sur incident vous donnera une trace de la pile et des informations détaillées sur les erreurs.
Edit: Quant à ne pas pouvoir installer un débogueur, DrWatson est préinstallé et capable de générer des vidages sur incident qui peuvent ensuite être examinés sur une machine différente.