Exemples DBH supplémentaires
Voici des exemples supplémentaires de commandes qui peuvent être émises à l’invite DBH.
Affichage des symboles privés et des symboles publics
Si la cible est un fichier de symboles complet, chaque symbole public apparaît deux fois dans le fichier : dans la table de symboles publics et dans les données de symboles privés. La copie dans la table de symboles publics contient souvent diverses décorations (préfixes et suffixes). Pour plus d’informations, consultez Symboles publics et privés.
DBH peut afficher des informations sur ce symbole à partir des données de symboles privés, de la table de symboles publics sans décorations et de la table de symboles publics avec des décorations. Voici un exemple dans lequel les trois d’entre eux sont affichés, à l’aide du addr de commande 414fe0 à chaque fois.
La première fois que cette commande apparaît dans cet exemple, DBH utilise les options de symboles par défaut, de sorte que les informations obtenues proviennent des données de symboles privés. Notez que ces informations incluent l’adresse, la taille et le type de données des fonctions fgets. Ensuite, la commande symopt +4000 est utilisée, ce qui active l’option SYMOPT_PUBLICS_ONLY. DbH ignore ainsi les données de symboles privés et, par conséquent, lorsque la commande addr 414fe0 est exécutée la deuxième fois, DBH utilise la table de symboles publics, et aucune taille ou aucune information de type de données n’est affichée pour les fonctions fgets. Enfin, la commande symopt -2 est utilisée, en désactivant l’option SYMOPT_UNDNAME et en provoquant DBH d’inclure des décorations. Lorsque l’addr 414fe0 s’exécute cette dernière fois, il affiche la version décorée du nom de la fonction, _fgets.
pid:4308 mod:TimeTest[400000]: addr 414fe0
fgets
name : fgets
addr : 414fe0
size : 113
flags : 0
type : 7e
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 7d
pid:4308 mod:TimeTest[400000]: symopt +4000
Symbol Options: 0x10c13
Symbol Options: 0x14c13
pid:4308 mod:TimeTest[400000]: addr 414fe0
fgets
name : fgets
addr : 414fe0
size : 0
flags : 0
type : 0
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagPublicSymbol (a)
index : 7f
pid:4308 mod:TimeTest[400000]: symopt -2
Symbol Options: 0x14c13
Symbol Options: 0x14c11
pid:4308 mod:TimeTest[400000]: addr 414fe0
_fgets
name : _fgets
addr : 414fe0
size : 0
flags : 0
type : 0
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagPublicSymbol (a)
index : 7f
Si l’option de ligne de commande -d avait été utilisée, les résultats auraient affiché le nom public décoré depuis le début.
Détermination des décorations d’un symbole spécifique
DBH peut déterminer les décorations sur un symbole spécifique. Cela peut être utile lorsqu’il est utilisé conjointement avec un programme qui exige que les symboles soient spécifiés avec leurs décorations, telles que PDBCopy.
Par exemple, supposons que vous savez que le fichier de symboles mysymbols.pdb contient un symbole dont le nom non décodé est MyFunction1. Pour trouver le nom décoré, utilisez la procédure suivante.
Tout d’abord, démarrez DBH sans l’option de ligne de commande -d, puis utilisez la commande symopt +4000 pour que toutes les informations proviennent de la table de symboles publics :
C:\> dbh c:\mydir\mysymbols.pdb
mysymbols [1000000]: symopt +4000
Symbol Options: 0x10c13
Symbol Options: 0x14c13
Ensuite, utilisez la commande name ou la commande enum pour afficher l’adresse du symbole souhaité :
mysymbols [1000000]: enum myfunction1
index address name
2ab 102cb4e : MyFunction1
Utilisez maintenant symopt -2 pour rendre les décorations de symboles visibles, puis utilisez la commande addr avec l’adresse de ce symbole :
mysymbols [1000000]: symopt -2
Symbol Options: 0x14c13
Symbol Options: 0x14c11
mysymbols [1000000]: addr 102cb4e
_MyFunction1@4
name : _InterlockedIncrement@4
addr : 102cb4e
size : 0
flags : 0
type : 0
modbase : 1000000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagPublicSymbol (a)
index : 2ab
Cela révèle que le nom décoré du symbole est _MyFunction1@4.
Décodage des décorations de symboles
La commande undec peut être utilisée pour révéler la signification des décorations de symboles C++. Dans l’exemple suivant, les décorations attachées à ?? _C@_03GGCAPAJC@Sep ?$AA@ sont décodés pour indiquer qu’il s’agit d’une chaîne :
dbh: undec ??_C@_03GGCAPAJC@Sep?$AA@
??_C@_03GGCAPAJC@Sep?$AA@ =
`string'
Les exemples suivants décodent les décorations attachées à trois noms de fonction, révélant leurs prototypes :
dbh: undec ?gcontext@@3_KA
?gcontext@@3_KA =
unsigned __int64 gcontext
dbh: undec ?pathcpy@@YGXPAGPBG1K@Z
?pathcpy@@YGXPAGPBG1K@Z =
void __stdcall pathcpy(unsigned short *,unsigned short const *,unsigned short const *,unsigned long)
dbh: undec ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z
?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z =
int (__cdecl*__cdecl _set_new_handler(int (__cdecl*)(unsigned int)))(unsigned int)
La commande undec n’affiche pas d’informations sur les traits de soulignement initiaux, le préfixe __imp_ ou les décorations «@ adresse » de fin, qui sont généralement attachées aux noms de fonction.
Vous pouvez utiliser la commande undec avec n’importe quelle chaîne, pas seulement le nom d’un symbole dans le module actuellement chargé.
Tri d’une liste de symboles par adresse
Si vous souhaitez simplement obtenir une liste de symboles, triés dans l’ordre d’adresse, vous pouvez exécuter DBH en mode batch et diriger les résultats vers une commande de tri . Les valeurs d’adresse commencent généralement dans la 18e colonne de chaque ligne, de sorte que la commande suivante trie les résultats par adresse :
dbh -p:4672 enum mymodule!* | sort /+18
Affichage des informations de ligne source
Lorsque vous utilisez un fichier de symboles complet, DBH peut afficher des informations de ligne source. Cela ne nécessite pas d’accès aux fichiers sources, car ces informations sont stockées dans les fichiers de symboles eux-mêmes.
Ici, la commande de ligne affiche l’adresse hexadécimale des instructions binaires correspondant à la ligne source spécifiée et affiche les symboles associés à cette ligne. (Dans cet exemple, aucun symbole n’est associé à la ligne.)
dbh [1000000]: line myprogram.cpp#767
file : e:\mydirectory\src\myprogram.cpp
line : 767
addr : 1006191
key : 0000000000000000
disp : 0
Ici, la commande srclines affiche les fichiers objet associés à la ligne source spécifiée :
dbh [1000000]: srclines myprogram.cpp 767
0x1006191: e:\mydirectory\objchk\amd64\myprogram.obj
line 767 e:\mydirectory\src\myprogram.cpp
Notez que la sortie de srclines est similaire à celle de la commande de débogueur ln (List Nearest Symbols).
Affichage d’un type de données
La commande de type peut être utilisée pour afficher des informations sur un type de données. Ici, il affiche des données sur le type CMDPROC :
dbh [1000000]: type CMDPROC
name : CMDPROC
addr : 0
size : 8
flags : 0
type : c
modbase : 1000000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagTypedef (11)
index : c
La valeur répertoriée après « tag » spécifie la nature de ce type de données. Dans ce cas, SymTagTypedef indique que ce type a été défini à l’aide d’une instruction typedef .
Utilisation de symboles imaginaires
La commande add peut ajouter un symbole imaginaire au module chargé. Le fichier de symboles réel n’est pas modifié ; seule l’image de ce fichier dans la mémoire de DBH est modifiée.
La commande add peut être utile si vous souhaitez remplacer temporairement les symboles associés à une plage d’adresses donnée. Dans l’exemple suivant, une partie de la plage d’adresses associée à MyModule !main est remplacée par le symbole imaginaire MyModule !magic.
Voici comment le module apparaît avant l’ajout du symbole imaginaire. Notez que la fonction principale commence à 0x0042CC56 et a une taille 0x42B. Par conséquent, lorsque la commande addr est utilisée avec l’adresse 0x0042CD10, elle reconnaît cette adresse comme se trouvant dans les limites de la fonction principale :
pid:6040 mod:MyModule[400000]: enum timetest!ma*
index address name
1 42cc56 : main
3 415810 : malloc
5 415450 : mainCRTStartup
pid:6040 mod:MyModule[400000]: addr 42cc56
main
name : main
addr : 42cc56
size : 42b
flags : 0
type : 2
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 1
pid:6040 mod:MyModule[400000]: addr 42cd10
main+ba
name : main
addr : 42cc56
size : 42b
flags : 0
type : 2
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 1
Maintenant, la magie des symboles est ajoutée à l’adresse 0x0042CD00, avec une taille 0x10 octets. Lorsque la commande enum est utilisée, le bit élevé dans l’index est défini, montrant qu’il s’agit d’un symbole imaginaire :
pid:6040 mod:MyModule[400000]: add magic 42cd00 10
pid:6040 mod:MyModule[400000]: enum timetest!ma*
index address name
1 42cc56 : main
3 415810 : malloc
5 415450 : mainCRTStartup
80000001 42cd00 : magic
Lorsque la commande addr est utilisée, elle recherche les symboles dont les plages incluent l’adresse spécifiée. Étant donné que cette recherche commence par l’adresse spécifiée et s’exécute en arrière, l’adresse 0x004CD10 est désormais associée à la magie. En revanche, l’adresse 0x004CD40 est toujours associée à main, car elle se trouve en dehors de la plage du symbole magique . Notez également que la balise SymTagCustom indique un symbole imaginaire :
pid:6040 mod:MyModule[400000]: addr 42cd10
magic+10
name : magic
addr : 42cd00
size : 10
flags : 1000
type : 0
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagCustom (1a)
index : 80000001
pid:6040 mod:MyModule[400000]: addr 42cd40
main+ea
name : main
addr : 42cc56
size : 42b
flags : 0
type : 2
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 1
Enfin, la commande del peut supprimer la magie des symboles, renvoyant tous les symboles à leurs plages d’origine :
pid:6040 mod:MyModule[400000]: del magic
pid:6040 mod:MyModule[400000]: enum timetest!ma*
index address name
1 42cc56 : main
3 415810 : malloc
5 415450 : mainCRTStartup