Delen via


Aanvullende DBH-voorbeelden

Hier volgen aanvullende voorbeelden van opdrachten die kunnen worden uitgegeven bij de DBH-prompt.

Persoonlijke symbolen en openbare symbolen weergeven

Als het doel een volledig symboolbestand is, wordt elk openbaar symbool twee keer weergegeven in het bestand: in de tabel met openbare symbolen en in de persoonlijke symboolgegevens. De kopie in de openbare symbooltabel bevat vaak verschillende decoraties (voorvoegsels en achtervoegsels). Zie Openbare en persoonlijke symbolen voor meer informatie.

DBH kan informatie over dit symbool weergeven uit de persoonlijke symboolgegevens, uit de openbare symbooltabel zonder decoraties en uit de openbare symbooltabel met decoraties. Hier is een voorbeeld waarin alle drie worden weergegeven, elke keer met behulp van de opdracht addr 414fe0.

De eerste keer dat deze opdracht wordt weergegeven in dit voorbeeld, gebruikt DBH de standaardsymboolopties, zodat de resulterende informatie afkomstig is van de persoonlijke symboolgegevens. Houd er rekening mee dat deze informatie het adres, de grootte en het gegevenstype van de functie-fgets bevat. Vervolgens wordt de opdracht symopt +4000 gebruikt, waarmee de optie SYMOPT_PUBLICS_ONLY wordt ingeschakeld. Dit zorgt ervoor dat DBH de gegevens van het persoonlijke symbool negeert en daarom wanneer de addr 414fe0-opdracht de tweede keer wordt uitgevoerd, DBH de tabel met openbare symbolen gebruikt en er geen gegevens over grootte of gegevenstype worden weergegeven voor de functie-fgets. Ten slotte wordt de opdracht symopt -2 gebruikt, waardoor de optie SYMOPT_UNDNAME wordt uitgeschakeld en ervoor zorgt dat DBH decoraties bevat. Wanneer de addr 414fe0 deze laatste keer wordt uitgevoerd, wordt de gedecoreerde versie van de functienaam, _fgets, weergegeven.

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 

Als de -d opdrachtregeloptie is gebruikt, zouden de resultaten vanaf het begin de versierde openbare naam hebben weergegeven.

De decoraties van een specifiek symbool bepalen

DBH kan de decoraties op een specifiek symbool bepalen. Dit kan handig zijn bij gebruik in combinatie met een programma waarvoor symbolen moeten worden opgegeven met hun decoraties, zoals PDBCopy.

Stel dat u weet dat het symboolbestand mysymbols.pdb een symbool bevat waarvan de ongemarkeerde naam MyFunction1 is. Gebruik de volgende procedure om de versierde naam te vinden.

Start eerst DBH zonder de -d opdrachtregeloptie en gebruik vervolgens de opdracht symopt +4000, zodat alle informatie afkomstig is van de openbare symbooltabel:

C:\> dbh c:\mydir\mysymbols.pdb

mysymbols [1000000]: symopt +4000

Symbol Options: 0x10c13
Symbol Options: 0x14c13 

Gebruik vervolgens de naamopdracht of de enum-opdracht om het adres van het gewenste symbool weer te geven:

mysymbols [1000000]: enum myfunction1 

 index            address     name
   2ab            102cb4e :   MyFunction1

Gebruik nu symopt -2 om symbooldecoraties zichtbaar te maken en gebruik vervolgens de opdracht addr met het adres van dit symbool:

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  

Dit laat zien dat de versierde naam van het symbool _MyFunction1@4 is.

Decodering van symbooldecoraties

De undec-opdracht kan worden gebruikt om de betekenis van C++-symbooldecoraties weer te geven. In het volgende voorbeeld worden de decoraties van ??_C@_03GGCAPAJC@Sep?$AA@ gedecodeerd om aan te geven dat het een tekenreeks is:

dbh: undec ??_C@_03GGCAPAJC@Sep?$AA@

??_C@_03GGCAPAJC@Sep?$AA@ =
`string' 

De volgende voorbeelden decoderen de decoraties die zijn gekoppeld aan drie functienamen, waarbij hun prototypes zichtbaar zijn:

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) 

De undec-opdracht geeft geen informatie weer over initiƫle onderstrepingstekens, het voorvoegsel __imp_ of volgtekende '@adres'-decoraties, die vaak aan functienamen zijn gekoppeld.

U kunt de opdracht undec gebruiken met een willekeurige tekenreeks, niet alleen de naam van een symbool in de momenteel geladen module.

Een lijst met symbolen sorteren op adres

Als u gewoon een lijst met symbolen wilt, gesorteerd in adresvolgorde, kunt u DBH uitvoeren in de batchmodus en de resultaten doorsluizen naar een sorteeropdracht . De adreswaarden beginnen meestal in de 18e kolom van elke regel, dus met de volgende opdracht worden de resultaten gesorteerd op adres:

dbh -p:4672 enum mymodule!* | sort /+18

Bronregelinformatie weergeven

Wanneer u een volledig symboolbestand gebruikt, kan DBH bronregelinformatie weergeven. Hiervoor is geen toegang tot bronbestanden vereist, omdat deze informatie zelf wordt opgeslagen in de symboolbestanden.

Hier geeft de opdrachtregelopdracht het hexadecimale adres van de binaire instructies weer die overeenkomen met de opgegeven bronregel en worden de symbolen weergegeven die aan die regel zijn gekoppeld. (In dit voorbeeld zijn er geen symbolen gekoppeld aan de lijn.)

dbh [1000000]: line myprogram.cpp#767

   file : e:\mydirectory\src\myprogram.cpp
   line : 767
   addr :  1006191
    key : 0000000000000000
disp : 0

Hier geeft de opdracht srclines de objectbestanden weer die zijn gekoppeld aan de opgegeven bronregel:

dbh [1000000]: srclines myprogram.cpp 767

0x1006191: e:\mydirectory\objchk\amd64\myprogram.obj
line 767 e:\mydirectory\src\myprogram.cpp

Houd er rekening mee dat de uitvoer van srclines vergelijkbaar is met die van de foutopsporingsprogrammaopdracht LN (List Nearest Symbols ).

Een gegevenstype weergeven

De typeopdracht kan worden gebruikt om informatie over een gegevenstype weer te geven. Hier worden gegevens over het CMDPROC-type weergegeven:

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

De waarde die na 'tag' wordt vermeld, geeft de aard van dit gegevenstype aan. In dit geval geeft SymTagTypedef aan dat dit type is gedefinieerd met behulp van een typedef-instructie .

Imaginaire symbolen gebruiken

Met de opdracht Toevoegen kunt u een imaginair symbool toevoegen aan de geladen module. Het werkelijke symboolbestand wordt niet gewijzigd; alleen de afbeelding van dat bestand in het geheugen van DBH wordt gewijzigd.

De opdracht toevoegen kan handig zijn als u tijdelijk wilt overschrijven welke symbolen aan een bepaald adresbereik zijn gekoppeld. In het volgende voorbeeld wordt een deel van het adresbereik dat is gekoppeld aan MyModule!main overschreven door het imaginaire symbool MyModule!magic.

Hier ziet u hoe de module wordt weergegeven voordat het imaginaire symbool wordt toegevoegd. Houd er rekening mee dat de hoofdfunctie begint bij 0x0042CC56 en grootte heeft 0x42B. Dus wanneer de opdracht addr wordt gebruikt met het adres 0x0042CD10, herkent het dit adres als ligt binnen de grenzen van de hoofdfunctie :

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 

Nu wordt het symbool magic toegevoegd op adres 0x0042CD00, met een grootte van 0x10 bytes. Wanneer de enum-opdracht wordt gebruikt, wordt de hoge bit in de index ingesteld, waarin wordt weergegeven dat dit een imaginair symbool is:

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 

Wanneer de opdracht addr wordt gebruikt, wordt gezocht naar symbolen waarvan de bereiken het opgegeven adres bevatten. Omdat deze zoekopdracht begint met het opgegeven adres en achterwaarts wordt uitgevoerd, wordt het adres 0x004CD10 nu gekoppeld aan magie. Aan de andere kant is het adres 0x004CD40 nog steeds gekoppeld aan hoofd, omdat het buiten het bereik van het magische symbool ligt. Houd er ook rekening mee dat de tag SymTagCustom een imaginair symbool aangeeft:

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 

Ten slotte kan de del-opdracht het symbool magic verwijderen, waardoor alle symbolen terugkeren naar de oorspronkelijke reeksen.

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