Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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