Partager via


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