Lecture de symboles à partir d’en-têtes Paged-Out
Le débogueur de noyau doit lire l’en-tête de l’image de chaque module chargé afin de savoir quels symboles correspondent à ce module.
Si l’en-tête d’un module est paginé sur le disque, le débogueur ne charge pas de symboles pour ce module. Si cela se produit avec un module essentiel au processus de débogage, il peut s’agir d’un problème critique.
La procédure suivante peut être utilisée pour résoudre ce problème.
Pour acquérir des symboles pour les en-têtes paginés
Effectuez une deuxième copie du noyau lui-même. Il est probablement plus facile de placer cela sur un partage réseau.
Ajoutez le répertoire racine de ce partage au chemin du symbole. Pour connaître les façons de modifier le chemin du symbole, consultez Chemin d’accès aux symboles.
Utilisez la commande .reload (Recharger le module).
Utilisez la commande d’extension bruyante !sym pour afficher une sortie plus détaillée. Si cette option est utilisée, vous pourrez voir quels symboles sont chargés à partir des images de module sur l’ordinateur cible et lesquels sont chargés à partir de la copie des modules du noyau.
Cette technique doit être utilisée avec précaution, car le débogueur n’a aucun moyen de vérifier si les copies de fichier correspondent réellement aux originaux. Il est donc essentiel que la version de Windows utilisée sur le partage réseau corresponde à la version utilisée sur l’ordinateur cible.
Cette technique est utilisée uniquement pour le débogage en mode noyau. Le système d’exploitation est capable de paginer tous les en-têtes requis pendant le débogage en mode utilisateur (sauf si le disque contenant le fichier de pagination est démonté ou inaccessible).
Voici un exemple de cette technique utilisée :
kd> .reload
Connected to Windows XP 2268 x86 compatible target, ptr64 FALSE
Loading Kernel Symbols
..........Unable to read image header for dmload.sys at fe0be000 - NTSTATUS 0xC0000001
..........Unable to read image header for dmboot.sys at fda93000 - NTSTATUS 0xC0000001
.....................................Unable to read image header for fdc.sys at fdfc2000 - NTSTATUS 0xC0000001
...Unable to read image header for flpydisk.sys at fde4a000 - NTSTATUS 0xC0000001
.Unable to read image header for Fs_Rec.SYS at fe0c8000 - NTSTATUS 0xC0000001
.Unable to read image header for Null.SYS at fe2c4000 - NTSTATUS 0xC0000001
...................Unable to read image header for win32k.sys at a0000000 - NTSTATUS 0xC0000001
..Unable to read image header for dxg.sys at a0194000 - NTSTATUS 0xC0000001
.......Unable to read image header for ati2draa.dll at a01a4000 - NTSTATUS 0xC0000001
..Unable to read image header for ParVdm.SYS at fe116000 - NTSTATUS 0xC0000001
.......
Loading unloaded module list
..............
Loading User Symbols
Unable to retrieve the PEB address. This is usually caused
by being in the wrong process context or by paging
Notez que de nombreuses images ont des en-têtes inaccessibles. Vérifiez les symboles de l’un de ces fichiers (dans cet exemple, fs_rec.sys) :
kd> x fs_rec!*
*** ERROR: Module load completed but symbols could not be loaded for fs_rec.sys
Ces en-têtes sont apparemment mis en page. Vous devez donc ajouter les images appropriées au chemin du symbole :
kd> .sympath+ \\myserver\myshare\symbols\x86fre\symbols
Symbol search path is: symsrv*symsrv.dll*c:\localcache*https://msdl.microsoft.com/download/symbols;\\myserver\myshare\symbols\x86fre\symbols
kd> .reload
Connected to Windows XP 2268 x86 compatible target, ptr64 FALSE
Loading Kernel Symbols
..........Unable to read image header for dmload.sys at fe0be000 - NTSTATUS 0xC0000001
..........Unable to read image header for dmboot.sys at fda93000 - NTSTATUS 0xC0000001
.....................................Unable to read image header for fdc.sys at fdfc2000 - NTSTATUS 0xC0000001
...Unable to read image header for flpydisk.sys at fde4a000 - NTSTATUS 0xC0000001
.Unable to read image header for Fs_Rec.SYS at fe0c8000 - NTSTATUS 0xC0000001
.Unable to read image header for Null.SYS at fe2c4000 - NTSTATUS 0xC0000001
...................Unable to read image header for win32k.sys at a0000000 - NTSTATUS 0xC0000001
..Unable to read image header for dxg.sys at a0194000 - NTSTATUS 0xC0000001
.......Unable to read image header for ati2draa.dll at a01a4000 - NTSTATUS 0xC0000001
..Unable to read image header for ParVdm.SYS at fe116000 - NTSTATUS 0xC0000001
.......
Loading unloaded module list
..............
Loading User Symbols
Unable to retrieve the PEB address. This is usually caused
by being in the wrong process context or by paging
Les mêmes avertissements sont apparus, mais les symboles eux-mêmes sont désormais accessibles :
kd> x fs_Rec!*
fe0c8358 Fs_Rec!_imp___allmul
fe0c8310 Fs_Rec!_imp__IoCreateDevice
fe0c835c Fs_Rec!_imp___allshr
........
fe0c8360 Fs_Rec!ntoskrnl_NULL_THUNK_DATA
fe0c832c Fs_Rec!_imp__KeSetEvent
fe0c9570 Fs_Rec!_NULL_IMPORT_DESCRIPTOR