Altri esempi di DBH

Di seguito sono riportati altri esempi di comandi che possono essere eseguiti al prompt dbh.

Visualizzazione di simboli privati e simboli pubblici

Se la destinazione è un file di simboli completo, ogni simbolo pubblico viene visualizzato due volte nel file: nella tabella dei simboli pubblici e nei dati dei simboli privati. La copia nella tabella dei simboli pubblica spesso contiene varie decorazioni (prefissi e suffissi). Per informazioni dettagliate, vedere Simboli pubblici e privati.

DBH può visualizzare informazioni su questo simbolo dai dati dei simboli privati, dalla tabella dei simboli pubblica senza decorazioni e dalla tabella dei simboli pubblica con decorazioni. Di seguito è riportato un esempio in cui vengono visualizzati tutti e tre, usando il comando addr 414fe0 ogni volta.

La prima volta che questo comando viene visualizzato in questo esempio, DBH usa le opzioni di simboli predefinite, quindi le informazioni risultanti provengono dai dati dei simboli privati. Si noti che queste informazioni includono l'indirizzo, le dimensioni e il tipo di dati delle funzioni fget. Viene quindi usato il comando symopt +4000, che attiva l'opzione SYMOPT_PUBLICS_ONLY. In questo modo DBH ignora i dati dei simboli privati e pertanto quando il comando addr 414fe0 viene eseguito la seconda volta, DBH usa la tabella dei simboli pubblica e non vengono visualizzate informazioni sulle dimensioni o sul tipo di dati per i fget della funzione. Infine, viene usato il comando symopt -2, disattivando l'opzione SYMOPT_UNDNAME e facendo sì che DBH includa decorazioni. Quando il componente aggiuntivo 414fe0 esegue questa ora finale, viene visualizzata la versione decorata del nome della funzione _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 

Se l'opzione della riga di comando -d fosse stata usata, i risultati avrebbero mostrato il nome pubblico decorato dall'inizio.

Determinazione delle decorazioni di un simbolo specifico

DBH può determinare le decorazioni su un simbolo specifico. Ciò può essere utile quando usato insieme a un programma che richiede l'impostazione dei simboli con le relative decorazioni, ad esempio PDBCopy.

Si supponga, ad esempio, di sapere che il file di simboli mysymbols.pdb contiene un simbolo il cui nome non dichiarato è MyFunction1. Per trovare il nome decorato, utilizzare la procedura seguente.

Per prima cosa, avviare DBH senza l'opzione della riga di comando -d e quindi usare il comando symopt +4000 in modo che tutte le informazioni provenga dalla tabella dei simboli pubblica:

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

mysymbols [1000000]: symopt +4000

Symbol Options: 0x10c13
Symbol Options: 0x14c13 

Usare quindi il comando name o il comando enum per visualizzare l'indirizzo del simbolo desiderato:

mysymbols [1000000]: enum myfunction1 

 index            address     name
   2ab            102cb4e :   MyFunction1

Usare ora symopt -2 per rendere visibili le decorazioni dei simboli e quindi usare il comando addr con l'indirizzo di questo simbolo:

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  

Ciò rivela che il nome decorato del simbolo è _MyFunction1@4.

Decodificare le decorazioni dei simboli

Il comando undec può essere usato per rivelare il significato delle decorazioni dei simboli C++. Nell'esempio seguente le decorazioni collegate a ?? _C@_03GGCAPAJC@Sep?$AA@ vengono decodificati per indicare che si tratta di una stringa:

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

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

Gli esempi seguenti decodificano le decorazioni associate a tre nomi di funzione, rivelando i loro prototipi:

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) 

Il comando undec non visualizza informazioni sui caratteri di sottolineatura iniziali, sul prefisso __imp_ o sulle decorazioni "@address" finali, comunemente associate ai nomi delle funzioni.

È possibile usare il comando undec con qualsiasi stringa, non solo il nome di un simbolo nel modulo attualmente caricato.

Ordinamento di un elenco di simboli per indirizzo

Se si vuole semplicemente un elenco di simboli, ordinati in ordine di indirizzo, è possibile eseguire DBH in modalità batch e inviare tramite pipe i risultati a un comando di ordinamento . I valori degli indirizzi iniziano in genere nella 18a colonna di ogni riga, quindi il comando seguente ordina i risultati in base all'indirizzo:

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

Visualizzazione delle informazioni sulla riga di origine

Quando si usa un file di simboli completo, DBH può visualizzare le informazioni sulla riga di origine. Ciò non richiede l'accesso ad alcun file di origine, poiché queste informazioni vengono archiviate nei file di simboli stessi.

In questo caso, il comando della riga visualizza l'indirizzo esadecimale delle istruzioni binarie corrispondenti alla riga di origine specificata e visualizza i simboli associati a tale riga. In questo esempio non sono presenti simboli associati alla riga.

dbh [1000000]: line myprogram.cpp#767

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

In questo caso, il comando srclines visualizza i file oggetto associati alla riga di origine specificata:

dbh [1000000]: srclines myprogram.cpp 767

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

Si noti che l'output di srclines è simile a quello del debugger ln (List Nearest Symbols).

Visualizzazione di un tipo di dati

Il comando type può essere usato per visualizzare informazioni su un tipo di dati. Qui vengono visualizzati i dati sul tipo 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

Il valore elencato dopo "tag" specifica la natura di questo tipo di dati. In questo caso, SymTagTypedef indica che questo tipo è stato definito usando un'istruzione typedef .

Uso di simboli immaginari

Il comando add può aggiungere un simbolo immaginario al modulo caricato. Il file di simboli effettivo non viene modificato; viene modificata solo l'immagine del file nella memoria di DBH.

Il comando add può essere utile se si desidera eseguire temporaneamente l'override dei simboli associati a un determinato intervallo di indirizzi. Nell'esempio seguente, una parte dell'intervallo di indirizzi associato a MyModule!main viene sostituita dal simbolo immaginario MyModule!magic.

Ecco come viene visualizzato il modulo prima dell'aggiunta del simbolo immaginario. Si noti che la funzione principale inizia a 0x0042CC56 e ha dimensioni 0x42B. Pertanto, quando il comando addr viene usato con l'indirizzo 0x0042CD10, riconosce questo indirizzo come all'interno dei limiti della funzione 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 

Ora il simbolo magic viene aggiunto al 0x0042CD00 dell'indirizzo, con dimensioni 0x10 byte. Quando si usa il comando enumerazione , viene impostato il bit alto nell'indice, che mostra che si tratta di un simbolo immaginario:

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 

Quando viene usato il comando addr , cerca tutti i simboli i cui intervalli includono l'indirizzo specificato. Poiché questa ricerca inizia con l'indirizzo specificato ed esegue all'indietro, l'indirizzo 0x004CD10 è ora associato a magic. D'altra parte, l'indirizzo 0x004CD40 è ancora associato a main, perché si trova al di fuori dell'intervallo del simbolo magico . Si noti anche che il tag SymTagCustom indica un simbolo immaginario:

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 

Infine, il comando del può eliminare la magia del simbolo, restituendo tutti i simboli agli intervalli originali:

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