Freigeben über


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