Zusätzliche DBH-Beispiele
Hier finden Sie weitere Beispiele für Befehle, die an der DBH-Eingabeaufforderung ausgegeben werden können.
Anzeigen privater Symbole und öffentlicher Symbole
Wenn das Ziel eine vollständige Symboldatei ist, wird jedes öffentliche Symbol zweimal in der Datei angezeigt: in der öffentlichen Symboltabelle und in den privaten Symboldaten. Die Kopie in der öffentlichen Symboltabelle enthält häufig verschiedene Dekorationen (Präfixe und Suffixe). Weitere Informationen finden Sie unter "Öffentliche und private Symbole".
DBH kann Informationen zu diesem Symbol aus den daten des privaten Symbols, aus der Tabelle für öffentliche Symbole ohne Dekorationen und aus der öffentlichen Symboltabelle mit Dekorationen anzeigen. Hier ist ein Beispiel, in dem alle drei angezeigt werden, wobei der Befehls-Addr 414fe0 jedes Mal verwendet wird.
Wenn dieser Befehl zum ersten Mal in diesem Beispiel angezeigt wird, verwendet DBH die Standardsymboloptionen, sodass die resultierenden Informationen aus den privaten Symboldaten stammen. Beachten Sie, dass diese Informationen die Adresse, Größe und datentyp der Funktionsausdrücke enthalten. Anschließend wird der Befehls symopt +4000 verwendet, der die option SYMOPT_PUBLICS_ONLY aktiviert. Dies bewirkt, dass DBH die privaten Symboldaten ignoriert, und wenn der Addr 414fe0-Befehl zum zweiten Mal ausgeführt wird, verwendet DBH die öffentliche Symboltabelle, und für die Funktionsfgets werden keine Größen- oder Datentypinformationen angezeigt. Schließlich wird der Befehls symopt -2 verwendet, die option SYMOPT_UNDNAME deaktiviert und bewirkt, dass DBH Dekorationen enthält. Wenn das Addr 414fe0 dieses letzte Mal ausgeführt wird, wird die dekorierte Version des Funktionsnamens _fgets angezeigt.
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
Wenn die Befehlszeilenoption -d verwendet wurde, hätten die Ergebnisse den eingerichteten öffentlichen Namen von Anfang an angezeigt.
Bestimmen der Dekorationen eines bestimmten Symbols
DBH kann die Dekorationen auf einem bestimmten Symbol bestimmen. Dies kann nützlich sein, wenn sie in Verbindung mit einem Programm verwendet werden, das Symbole mit ihren Dekorationen, wie z. B. PDBCopy, angeben muss.
Angenommen, Sie wissen, dass die Symboldatei mysymbols.pdb ein Symbol enthält, dessen nicht wirtschaftlicher Name "MyFunction1" lautet. Um den verzierten Namen zu finden, verwenden Sie das folgende Verfahren.
Starten Sie zunächst DBH ohne die Befehlszeilenoption -d, und verwenden Sie dann den Befehl symopt +4000, damit alle Informationen aus der öffentlichen Symboltabelle stammen:
C:\> dbh c:\mydir\mysymbols.pdb
mysymbols [1000000]: symopt +4000
Symbol Options: 0x10c13
Symbol Options: 0x14c13
Verwenden Sie als Nächstes den Namenbefehl oder den Enumerationsbefehl , um die Adresse des gewünschten Symbols anzuzeigen:
mysymbols [1000000]: enum myfunction1
index address name
2ab 102cb4e : MyFunction1
Verwenden Sie nun symopt -2, um Symbol-Dekorationen sichtbar zu machen, und verwenden Sie dann den Addr-Befehl mit der Adresse dieses Symbols:
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
Dadurch wird angezeigt, dass der verzierte Name des Symbols _MyFunction1@4 ist.
Decodierungssymbol-Dekorationen
Der Befehl "Undec " kann verwendet werden, um die Bedeutung von C++-Symbol-Dekorationen anzuzeigen. Im folgenden Beispiel werden die an ?? _C@_03GGCAPAJC@Sep?$AA@ werden decodiert, um anzugeben, dass es sich um eine Zeichenfolge handelt:
dbh: undec ??_C@_03GGCAPAJC@Sep?$AA@
??_C@_03GGCAPAJC@Sep?$AA@ =
`string'
Die folgenden Beispiele decodieren die Dekorationen, die an drei Funktionsnamen angefügt sind, und zeigen ihre Prototypen auf:
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)
Der Befehl "Undec " zeigt keine Informationen über anfängliche Unterstriche, das Präfix __imp_ oder nachfolgende "@Adress"-Dekorationen an, die häufig an Funktionsnamen angefügt sind.
Sie können den Befehl "Rückgängig " mit einer beliebigen Zeichenfolge verwenden, nicht nur den Namen eines Symbols im aktuell geladenen Modul.
Sortieren einer Liste von Symbolen nach Adresse
Wenn Sie einfach eine Liste von Symbolen wünschen, sortiert in der Adressreihenfolge, können Sie DBH im Batchmodus ausführen und die Ergebnisse an einen Sortierbefehl leiten. Die Adresswerte beginnen in der Regel in der 18. Spalte jeder Zeile, sodass der folgende Befehl die Ergebnisse nach Adresse sortiert:
dbh -p:4672 enum mymodule!* | sort /+18
Anzeigen von Quellzeileninformationen
Wenn Sie eine vollständige Symboldatei verwenden, kann DBH Quellzeileninformationen anzeigen. Dies erfordert keinen Zugriff auf Quelldateien, da diese Informationen in den Symboldateien selbst gespeichert werden.
Hier zeigt der Zeilenbefehl die hexadezimale Adresse der binären Anweisungen an, die der angegebenen Quellzeile entsprechen, und es werden die symbole angezeigt, die dieser Zeile zugeordnet sind. (In diesem Beispiel sind keine Symbole mit der Zeile verknüpft.)
dbh [1000000]: line myprogram.cpp#767
file : e:\mydirectory\src\myprogram.cpp
line : 767
addr : 1006191
key : 0000000000000000
disp : 0
Hier zeigt der Befehl "srclines " die Objektdateien an, die der angegebenen Quellzeile zugeordnet sind:
dbh [1000000]: srclines myprogram.cpp 767
0x1006191: e:\mydirectory\objchk\amd64\myprogram.obj
line 767 e:\mydirectory\src\myprogram.cpp
Beachten Sie, dass die Ausgabe von Srclines dem des Debuggerbefehls "ln" (Listennächste Symbole) ähnelt.
Anzeigen eines Datentyps
Der Typbefehl kann verwendet werden, um Informationen zu einem Datentyp anzuzeigen. Hier werden Daten zum CMDPROC-Typ angezeigt:
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
Der wert, der hinter "tag" aufgeführt ist, gibt die Art dieses Datentyps an. In diesem Fall gibt SymTagTypedef an, dass dieser Typ mithilfe einer typedef-Anweisung definiert wurde.
Verwenden von imaginären Symbolen
Der Befehl "Hinzufügen " kann dem geladenen Modul ein imaginäres Symbol hinzufügen. Die tatsächliche Symboldatei wird nicht geändert. nur das Bild dieser Datei im Speicher von DBH wird geändert.
Der Befehl zum Hinzufügen kann nützlich sein, wenn Sie vorübergehend außer Kraft setzen möchten, welche Symbole einem bestimmten Adressbereich zugeordnet sind. Im folgenden Beispiel wird ein Teil des Adressbereichs, der MyModule !main zugeordnet ist, durch das imaginäre Symbol MyModule!magic überschrieben.
So wird das Modul angezeigt, bevor das imaginäre Symbol hinzugefügt wird. Beachten Sie, dass die Hauptfunktion bei 0x0042CC56 beginnt und die Größe 0x42B hat. Wenn der Addr-Befehl also mit der Adresse 0x0042CD10 verwendet wird, erkennt er diese Adresse als liegend innerhalb der Grenzen der Hauptfunktion :
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
Nun wird die Symbol-Magie an der Adresse 0x0042CD00 mit der Größe 0x10 Bytes hinzugefügt. Wenn der Enumerationsbefehl verwendet wird, wird das hohe Bit im Index festgelegt, das zeigt, dass es sich um ein imaginäres Symbol handelt:
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
Wenn der Addr-Befehl verwendet wird, sucht er nach Symbolen, deren Bereiche die angegebene Adresse enthalten. Da diese Suche mit der angegebenen Adresse beginnt und rückwärts läuft, ist die Adresse 0x004CD10 jetzt mit Magie verbunden. Andererseits ist die Adresse 0x004CD40 immer noch mit dem Haupt verbunden, weil sie außerhalb des Bereichs des magischen Symbols liegt. Beachten Sie auch, dass das Tag SymTagCustom ein imaginäres Symbol angibt:
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
Schließlich kann der Del-Befehl die Symbol-Magie löschen und alle Symbole zu ihren ursprünglichen Bereichen zurückgeben:
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