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