J'ai attaché WinDbg à un processus en cours d'exécution et le processus s'est bloqué (j'ai une question distincte à propos de ce cas). Une fois le programme bloqué, WinDbg s’est arrêté et m’a permis de déboguer le programme. J'ai pris un vidage mémoire sur incident pour une enquête plus poussée avec la commande ".dump/ma".
Le programme a été compilé en tant que "Tout processeur" et j'ai utilisé WinDbg x64 pour effectuer le vidage. Maintenant, j'ouvre à nouveau WinDbg x64 sur le même ordinateur et ouvre le fichier de sauvegarde sur incident. Voici ce qu'il dit:
Loading Dump File [C:\crashdump.dmp]
User Mini Dump File with Full Memory: Only application data is available
Symbol search path is: SRV*c:\symbols*http://msdl.Microsoft.com/download/symbols
Executable search path is:
Windows 7 Version 7601 (Service Pack 1) MP (8 procs) Free x64
Product: WinNt, suite: SingleUserTS
Machine Name:
Debug session time: Mon Aug 15 10:24:57.000 2011 (UTC + 1:00)
System Uptime: 17 days 0:54:39.021
Process Uptime: 12 days 14:01:31.000
................................................................
...............................................................
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(1be0.b78): Access violation - code c0000005 (first/second chance not available)
*** WARNING: symbols timestamp is wrong 0x4dd2333e 0x4da4281c for clr.dll
clr!WKS::gc_heap::find_first_object+0x92:
000007fe`ea129a1d f70100000080 test dword ptr [rcx],80000000h ds:00000000`00003d80=????????
Ensuite, j'essaie de charger SOS avec ".load sos clr" et le message d'erreur:
The call to LoadLibrary(sos clr) failed, Win32 error 0n2
"The system cannot find the file specified."
Please check your debugger configuration and/or network access.
Essayer avec ".loadby sos clr" et ça marche. Maintenant, je veux voir la pile avec "! Clrstack" et coller ici:
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
2) the file mscordacwks.dll that matches your version of clr.dll is
in the version directory
3) or, if you are debugging a dump file, verify that the file
mscordacwks_<Arch>_<Arch>_<version>.dll is on your symbol path.
4) you are debugging on the same architecture as the dump file.
For example, an IA64 dump file must be debugged on an IA64
machine.
You can also run the debugger command .cordll to control the debugger's
load of mscordacwks.dll. .cordll -ve -u -l will do a verbose reload.
If that succeeds, the SOS command should work on retry.
If you are debugging a minidump, you need to make sure that your executable
path is pointing to clr.dll as well.
J'ai essayé ".symfix" et ".reload":
0:027> .symfix
0:027> .reload
..................*** WARNING: symbols timestamp is wrong 0x4dd2333e 0x4da4281c for clr.dll
..............................................
...............................................................
Coincé. En même temps, lorsque le processus est exécuté sous WinDgb, je peux suspendre l'exécution, charger SOS Et exécuter la commande "! Clrstack" avec succès.
Des idées? Merci.
UPDATE - a suivi les étapes fournies dans la deuxième réponse, ne fonctionne toujours pas.
1) Chemin de mon symbole: SRV * c:\symboles * http: //msdl.Microsoft.com/download/symbols; srv *
2) CLR chargé: 4.0.30319. 237 :
0:027> lm v clr
Unknown option 'r'
start end module name
00000000`77b60000 00000000`77d09000 ntdll (pdb symbols) c:\symbols\ntdll.pdb\6192BFDB9F04442995FFCB0BE95172E12\ntdll.pdb
Loaded symbol image file: ntdll.dll
Image path: C:\Windows\System32\ntdll.dll
Image name: ntdll.dll
Timestamp: Sat Nov 20 13:11:21 2010 (4CE7C8F9)
CheckSum: 001B55EA
ImageSize: 001A9000
File version: 6.1.7601.17514
Product version: 6.1.7601.17514
File flags: 0 (Mask 3F)
File OS: 40004 NT Win32
File type: 2.0 Dll
File date: 00000000.00000000
Translations: 0409.04b0
CompanyName: Microsoft Corporation
ProductName: Microsoft® Windows® Operating System
InternalName: ntdll.dll
OriginalFilename: ntdll.dll
ProductVersion: 6.1.7601.17514
FileVersion: 6.1.7601.17514 (win7sp1_rtm.101119-1850)
FileDescription: NT Layer DLL
LegalCopyright: © Microsoft Corporation. All rights reserved.
000007fe`e9fb0000 000007fe`ea915000 clr # (pdb symbols) c:\symbols\clr.pdb\1A7EA01DA29549DAB2B0BD012A6C5BA12\clr.pdb
Loaded symbol image file: clr.dll
Image path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Image name: clr.dll
Timestamp: Tue May 17 09:35:10 2011 (4DD2333E)
CheckSum: 00967144
ImageSize: 00965000
File version: 4.0.30319.237
Product version: 4.0.30319.237
File flags: 8 (Mask 3F) Private
File OS: 4 Unknown Win32
File type: 2.0 Dll
File date: 00000000.00000000
Translations: 0409.04b0
CompanyName: Microsoft Corporation
ProductName: Microsoft® .NET Framework
InternalName: clr.dll
OriginalFilename: clr.dll
ProductVersion: 4.0.30319.235
FileVersion: 4.0.30319.235 (RTMGDR.030319-2300)
PrivateBuild: DDBLD240
FileDescription: Microsoft .NET Runtime Common Language Runtime - WorkStation
LegalCopyright: © Microsoft Corporation. All rights reserved.
Comments: Flavor=Retail
3) "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscordacwks.dll" a la version 4.0.30319. 239
4) J'ai constaté que lorsque je charge le dump dans WinDbg, il charge le "mscordacwks.dll" correct à partir du Web, donc dans le dossier "C:\symboles\mscordacwks_AMD64_AMD64_4.0.30319.237.dll\4DD2333E965000". mscordacwks_AMD64_AMD64_4.0.30319.237.dll ".
5)
0:027> .cordll -ve -u -l
CLR DLL status: No load attempts
6)
0:027> !sym noisy
noisy mode - symbol prompts on
0:027> .restart
Loading Dump File [C:\crashdump.dmp]
User Mini Dump File with Full Memory: Only application data is available
DBGHELP: Symbol Search Path: srv*;srv*c:\symbols*http://msdl.Microsoft.com/download/symbols
DBGHELP: Symbol Search Path: cache*;SRV*http://msdl.Microsoft.com/download/symbols;srv*c:\symbols*http://msdl.Microsoft.com/download/symbols
DBGHELP: Symbol Search Path: cache*;SRV*http://msdl.Microsoft.com/download/symbols;srv*c:\symbols*http://msdl.Microsoft.com/download/symbols
Symbol search path is: srv*;SRV*c:\symbols*http://msdl.Microsoft.com/download/symbols
Executable search path is:
Windows 7 Version 7601 (Service Pack 1) MP (8 procs) Free x64
Product: WinNt, suite: SingleUserTS
Machine Name:
Debug session time: Mon Aug 15 10:24:57.000 2011 (UTC + 1:00)
System Uptime: 17 days 0:54:39.021
Process Uptime: 12 days 14:01:31.000
................................................................
...............................................................
DBGHELP: ntdll - public symbols
C:\Program Files\Debugging Tools for Windows (x64)\sym\ntdll.pdb\6192BFDB9F04442995FFCB0BE95172E12\ntdll.pdb
DBGHELP: Symbol Search Path: cache*;SRV*http://msdl.Microsoft.com/download/symbols;srv*c:\symbols*http://msdl.Microsoft.com/download/symbols
DBGHELP: Symbol Search Path: cache*;SRV*http://msdl.Microsoft.com/download/symbols;srv*c:\symbols*http://msdl.Microsoft.com/download/symbols
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(1be0.b78): Access violation - code c0000005 (first/second chance not available)
*** WARNING: symbols timestamp is wrong 0x4dd2333e 0x4da4281c for clr.dll
DBGHELP: clr - public symbols
C:\Program Files\Debugging Tools for Windows (x64)\sym\clr.pdb\1A7EA01DA29549DAB2B0BD012A6C5BA12\clr.pdb
clr!WKS::gc_heap::find_first_object+0x92:
000007fe`ea129a1d f70100000080 test dword ptr [rcx],80000000h ds:00000000`00003d80=????????
7)
0:027> !clrstack
SYMSRV: C:\Program Files\Debugging Tools for Windows (x64)\sym\mscordacwks_AMD64_AMD64_4.0.30319.237.dll\4DD2333E965000\mscordacwks_AMD64_AMD64_4.0.30319.237.dll not found
SYMSRV: mscordacwks_AMD64_AMD64_4.0.30319.237.dll from http://msdl.Microsoft.com/download/symbols: 502892 bytes - copied
DBGHELP: C:\Program Files\Debugging Tools for Windows (x64)\sym\mscordacwks_AMD64_AMD64_4.0.30319.237.dll\4DD2333E965000\mscordacwks_AMD64_AMD64_4.0.30319.237.dll cached to C:\Program Files\Debugging Tools for Windows (x64)\sym\mscordacwks_AMD64_AMD64_4.0.30319.237.dll\4DD233F317b000\mscordacwks_AMD64_AMD64_4.0.30319.237.dll
DBGHELP: C:\Program Files\Debugging Tools for Windows (x64)\sym\mscordacwks_AMD64_AMD64_4.0.30319.237.dll\4DD233F317b000\mscordacwks_AMD64_AMD64_4.0.30319.237.dll - OK
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
2) the file mscordacwks.dll that matches your version of clr.dll is
in the version directory
3) or, if you are debugging a dump file, verify that the file
mscordacwks_<Arch>_<Arch>_<version>.dll is on your symbol path.
4) you are debugging on the same architecture as the dump file.
For example, an IA64 dump file must be debugged on an IA64
machine.
You can also run the debugger command .cordll to control the debugger's
load of mscordacwks.dll. .cordll -ve -u -l will do a verbose reload.
If that succeeds, the SOS command should work on retry.
If you are debugging a minidump, you need to make sure that your executable
path is pointing to clr.dll as well.
Je frappe ceci régulièrement lors du débogage avec minidumps du site. Je ne suis pas sûr de savoir comment cela s'est passé dans votre cas. Cela se produit généralement lorsque la version de CLR chargée lors du dump n’est pas disponible sur votre machine de débogage. Dans votre cas, il s’agit de la même machine, elle devrait donc probablement tout simplement fonctionner. Je suis sûr que d’autres pourront expliquer précisément pourquoi.
En attendant, voici ce que je fais avec les vidages de mon site. Windbg recherche "la bonne version" de mscordacwks.dll. Nous lui donnons donc cette version et lui indiquons où la chercher.
Premièrement, si je trafique tout cela en supprimant mscordacwks.dll, windbg s’éteint et le charge à partir du serveur de symboles Microsoft. Assurez-vous donc que vos symboles sont correctement configurés pour télécharger des symboles à partir du serveur de symboles Microsoft et qu’ils y reviennent .
Maintenant - en supposant que cela ne fonctionne pas, vérifiez exactement quelle version est la "bonne version". Répertoriez les informations sur le module avec "lm v clr" et vérifiez la version de votre CLR chargée ACTUELLEMENT. Le mien est 4.0.30319.239. Ok - trouve maintenant cette version de mscordacwks.dll. Supposons qu'il se trouve dans l'installation normale du framework .NET sur votre machine (C:\Windows\Microsoft.NET\Framework64\v4.0.30319). Vérifiez que la version correspond exactement (clic droit, propriétés, etc.)! Prenez-le et mettez-le dans un endroit sûr (j'utilise D:\Symbols\_Images). Suivez les instructions que windbg vous a données pour renommer le fichier. mscordacwks _.dll serait mscordacwks_AMD64_AMD64_4.0.30319.239.dll.
Configurez maintenant le chemin de votre image exécutable (".exepath D:\Symbols\_Images") afin que windbg sache où vous l'avez placé.
Vous avez maintenant "la bonne version de mscordacwks" et vous l'avez renommée pour que Windbg sache ce qu'elle recherche et lui indique où vous l'avez mise.
Si cela ne fonctionne toujours pas, essayez alors ".cordll -ve -u -l" et "! Sym noisy" pour activer la journalisation détaillée de la charge cordll et du serveur de symboles, puis essayez à nouveau! CLRStack. Peut-être que le résultat de ces deux commandes vous dira exactement ce qu'il essaie de charger et vous pourrez comprendre pourquoi il ne le fera pas ...
Je viens de passer la journée à déboguer de nombreux cas dans lesquels nous avons rencontré ce scénario. Les fichiers SOS + CLR situés sur la même boîte que le crash ne pouvaient pas être chargés dans WinDbg, et "lm v" a signalé deux versions différentes pour le même module:
0: 011> lm vM * clr.dll Début/fin nom du module 000007fe`f2f50000 000007fe`f38b0000 clr # (symboles de pdb) c:\symboles\clr.pdb\EDFF900AC9B94D1B3269696A7989891A2\clr.p Fichier d'image de symbole chargé: clr.dll Chemin de l'image: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll Nom de l'image: clr.dll Horodatage: dim 21 avr. 03:36:04 2013 (5173C114) Somme de contrôle: 0095F379 Image Taille: 00960000 Version du fichier: 4.0.30319.18052 Version de produit: 4.0.30319.18052 Drapeaux de fichiers: 8 (masque 3F) Privé Fichier OS: 4 Inconnu Win32 Type de fichier: 2.0 Dll Date du fichier: 00000000.00000000 Traductions : 0409.04b0 CompanyName: Microsoft Corporation Nom du produit: Microsoft® .NET Framework InternalName: clr.dll OriginalFilename: clr.dll ProductVersion : 4.0.30319.18047 FileVersion: 4.0.30319.18047 construit par: FX45RTMGDR PrivateBuild: DDBLD320 FileDescription: Microsoft .NET Runtime Common Language Runtime - WorkStation Mentions légalesCopyright: © Microsoft Corporation. Tous droits réservés. Commentaires: Flavour = Retail
Le fichier Horodatage (0x5173C114), la somme de contrôle (0x0095F379) et la version (4.0.30319.18052) stockés dans la structure MINIDUMP_MODULE dans le module-list-stream du module minidump était destiné au nouveau CLR. Ouvrir le fichier minidump moi-même et regarder directement les données du flux:
MINIDUMP_MODULE: (pack: 8 taille: 112) + 0x000 .BaseOfImage UInt64: 8791579230208 (0x7FEF2F50000) + 0x008 .SizeOfImage UInt32: 9830400 (0x960000) + 0x008. .CheckSum UInt32: 9827193 (0x95F379) + 0x010 .TimeDateStamp UInt32: 1366540564 (0x5173C114) + 0x014 .ModuleNameRva UInt32: 107828 (0x1A534) + 0x018 .VersionInfo tagVS_FIXEDFILEINFO: (pack: 8 taille: 52) + 0x000 .dwSignature UInt32: 4277770181 .____.] + 0x004 .dwStrucVersion UInt32: 65536 (0x10000) + 0x008 .dwFileVersionMS UInt32: 262144 (0x40000) + 0x00C .dwFileVersionLS UInt32: 1987004036 (0x766F4684)
En séparant les mots haut et bas de dwFileVersionMS, nous obtenons 4 et 0.
En séparant les mots haut et bas de dwFileVersionLS, nous obtenons les 30319 et 18052.
En utilisant dumpchk.exe et en regardant les détails du module dans le PEB, nous pouvons voir un horodatage différent (0x515530CE), qui correspond en réalité à la version la plus ancienne (18047):
7fef2f50000 515530ce 28 mars 23:12:30 2013 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
En examinant la mémoire brute dans le vidage sur incident où clr.dll est chargé, vous pouvez voir la somme de contrôle (0x00965F80) et l'horodatage (0x515530CE) de la version 4.0.30319.18047:
0: 011> db 000007fe`f2f50000 000007fe`f2f50000 4d 5a 90 00 03 00 00-04-04 00 00ff 00 00 MZ .............. 000007fe`f2f50010 b8 00 00 00 00 00 00 00-40 00 00 00 00 00 00 ... ........ @ ....... 000007fe`f2f50020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000007fe`f2f50030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 01 00 00 ................ 000007fe`f2f50040 0e 1f ba 0e 00 b4 09 cd-21 b8 01 4c cd 21 54 68 .... ....! .. L.! Th 000007fe`f2f50050 69 73 20 70 72 6f 67 72-61 6d 20 63 61 6e 6e 6f est un programme canno 000007fe`f2f50060 74 20 62 65 20 72 75 6e-20 69 6e 20 44 4f 53 20 t être exécuté en mode DOS 000007fe`f2f50070 6d 6f 64 65 2e 0d 0a-24 00 00 00 00 00 00 00 .... $ ....... 0: 011> db 000007fe`f2f50080 39 e4 28 ed 7d 85 46 be-7d 85 46 be 7d 85 46 be 9. (.}. F. } .F.}. F. 000007fe`f2f50090 81 f2 f8 soit 79 85 46 be-81 f2 fa soit 74 85 46 be .... yF .... tF 000007fe` f2f500a0 74 fd c5 be 73 85 46 be-74 fd c2 be c9 85 46 be t ... sFt .... F. 000007fe`f2f500b0 ee 41 8d soit 7f 85 46 be-e3 25 81 be 7c 85 46 be .A .... F ..% .. | .F. 000007fe`f2f500c0 ee 41 88 be 6b 85 46 be-ee 41 89 be 78 85 46 be .A..kF.A .. xF 000007fe`f2f500d0 ee 41 8b soit 64 85 46 be-7d 85 47 be ca 87 46 be .A..dF} .G ... F. 000007fe`f2f500e0 81 f2 ff be 76 85 46 be-ee 41 9e be 70 87 46 be .... vF.A..pF 000007fe`f2f500f0 ee 41 8c soit 7c 85 46 be-ee 41 8f soit 7c 85 46 be. A .. | .F..A .. | .F. 0: 011> 000007fe`f2f50100 ee 41 8a soit 7c 85 46 be-52 69 63 68 7d 85 46 be. A .. | .F.Rich} .F. 000007fe`f2f50110 00 00 00 00 00 00 00 00-50 45 00 00 64 86 06 00 ........ PE..d. .. 000007fe`f2f50120 ce 30 55 51 00 00 00 00-00 00 00 00 00 f0 00 22 20 .0UQ .......... " 000007fe`f2f50130 0b 02 0b 00 00 90 69 00-00 c2 2b 00 00 00 00 00 ...... i ... + ..... 000007fe`f2f50140 40 51 13 00 00 00 00 00 f5 f2 fe 07 00 00 @Q ...... ........ 000007fe`f2f50150 00 10 00 00 00 02 00 00-06 00 00 00 00a 00 00 00 ................ 000007fe`f2f50160 06 00 00 00 00 00 00 00-00 e0 95 00 00 04 00 00 ................ 000007fe`f2f50170 80 5f 96 00 02 00 60 01-00 00 10 00 00 00 00 00 ._.... `.........
J'ai également progressé dans la mémoire, j'ai regardé la ressource Version en mémoire et vu la chaîne de version 18047.
Nous avons donc maintenant un minidump contenant des informations contradictoires sur la version de clr.dll réellement utilisée.
J'ai également découvert que notre service informatique avait récemment publié une poignée de mises à jour Windows.
Pour vérifier cela, j'ai modifié manuellement l'entrée MINIDUMP_MODULE pour clr.dll afin de modifier la somme de contrôle, l'horodatage et la version de 18052 à 18047. Après avoir rechargé le fichier .dmp piraté dans WinDbg et défini le chemin d'exépat sur les dll sos + clr correctes, J'ai réussi à exécuter les commandes sos et à obtenir une trace de pile valide.
Nous nous sommes essentiellement retrouvés avec un fichier minidump contenant des informations contradictoires sur la version de clr.dll chargée dans le processus, empêchant ainsi SOS d'identifier le bon moteur clr. Il s'agit probablement d'un bogue. dans MiniDumpWriteDump car il enregistre le fichier de vidage sur incident. Mais cela ne devrait se produire que lorsque la version de sauvegarde du CLR a été mise à jour pendant l'exécution de votre application.
Le processus que vous essayez de déboguer est-il un 32 bits? Que dit la liste des gestionnaires de tâches-processus? Si son processus 32 bits, vous devez utiliser windbg 32 bits. Sinon, je ne vois pas pourquoi .load sos clr
devrait échouer.
ps: (alerte noob windbg), donc je m'excuse si cela semble boiteux. J'essaye juste d'aider.
On dirait que vous avez fait une installation personnalisée de windbg sans sélectionner toutes les extensions dont vous avez besoin. L'erreur Win32 n2 est généralement un signe de ce problème.