Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Poniżej przedstawiono dodatkowe przykłady poleceń, które można wydać w wierszu poleceń DBH.
Wyświetlanie symboli prywatnych i symboli publicznych
Jeśli element docelowy jest pełnym plikiem symboli, każdy publiczny symbol pojawia się dwa razy w pliku: w publicznej tabeli symboli i w prywatnych danych symboli. Kopia w publicznej tabeli symboli często zawiera różne dekoracje (prefiksy i sufiksy). Aby uzyskać szczegółowe informacje, zobacz Publiczne i prywatne symbole.
DbH może wyświetlać informacje o tym symbolu z prywatnych danych symboli, z publicznej tabeli symboli bez dekoracji oraz z publicznej tabeli symboli z dekoracjami. Oto przykład, w którym są wyświetlane wszystkie trzy z nich, przy użyciu polecenia addr 414fe0.
Przy pierwszym pojawieniu się tego polecenia w tym przykładzie funkcja DBH używa domyślnych opcji symboli, więc wynikowe informacje pochodzą z prywatnych danych symboli. Należy pamiętać, że te informacje obejmują adres, rozmiar i typ danych fgets funkcji. Następnie jest używane polecenie symopt +4000, co włącza opcję SYMOPT_PUBLICS_ONLY. Powoduje to, że DBH ignoruje prywatne dane symboli i dlatego, gdy polecenie addr 414fe0 jest uruchamiane po raz drugi, DBH używa publicznej tabeli symboli, i nie wyświetla żadnych informacji o rozmiarze ani typie danych dla funkcji fgets. Na koniec jest używane polecenie symopt -2, wyłączając opcję SYMOPT_UNDNAME i powodując, że dbH uwzględnia dekoracje. Gdy adres 414fe0 jest uruchamiany tym ostatnim razem, pokazuje dekorowaną wersję nazwy funkcji _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
Gdyby opcja wiersza polecenia -d została użyta, wyniki pokazałyby przyozdobioną nazwę publiczną od samego początku.
Określanie dekoracji określonego symbolu
DbH może określić dekoracje na określonym symbolu. Może to być przydatne w połączeniu z programem, który wymaga określenia symboli z ich dekoracjami, takimi jak PDBCopy.
Załóżmy na przykład, że wiesz, że plik symboli mysymbols.pdb zawiera symbol, którego nieukodowana nazwa to MyFunction1. Aby znaleźć nazwę ozdobioną, użyj poniższej procedury.
Najpierw uruchom DBH bez opcji wiersza polecenia -d, a następnie użyj polecenia symopt +4000, aby wszystkie informacje pochodziły z publicznej tabeli symboli.
C:\> dbh c:\mydir\mysymbols.pdb
mysymbols [1000000]: symopt +4000
Symbol Options: 0x10c13
Symbol Options: 0x14c13
Następnie użyj polecenia name lub polecenia wyliczenia , aby wyświetlić adres żądanego symbolu:
mysymbols [1000000]: enum myfunction1
index address name
2ab 102cb4e : MyFunction1
Teraz użyj symopt -2, aby widoczne były dekoracje symboli, a następnie użyj polecenia addr z adresem tego symbolu:
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
Pokazuje to, że nazwa ozdobionego symbolu jest _MyFunction1@4.
Dekodowanie dekoracji symboli
Polecenie undec może służyć do ujawnienia znaczenia dekoracji symboli języka C++. W poniższym przykładzie dekoracje dołączone do ?? _C@_03GGCAPAJC@Sep?$AA@ są dekodowane, aby wskazać, że jest to ciąg:
dbh: undec ??_C@_03GGCAPAJC@Sep?$AA@
??_C@_03GGCAPAJC@Sep?$AA@ =
`string'
W poniższych przykładach dekoduj dekoracje dołączone do trzech nazw funkcji, ujawniając ich prototypy:
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)
Polecenie undec nie wyświetla informacji o początkowych podkreśleniach, prefiksie __imp_ lub końcowych dekoracjach "@adres", które są często dołączane do nazw funkcji.
Możesz użyć polecenia undec z dowolnym ciągiem, a nie tylko nazwą symbolu w aktualnie załadowanym module.
Sortowanie listy symboli według adresu
Jeśli chcesz po prostu wyświetlić listę symboli posortowanych w kolejności adresów, możesz uruchomić bazę danych DBH w trybie wsadowym i przekazać wyniki do polecenia sortowania . Wartości adresów zwykle zaczynają się w 18 kolumnie każdego wiersza, więc następujące polecenie sortuje wyniki według adresu:
dbh -p:4672 enum mymodule!* | sort /+18
Wyświetlanie informacji o wierszu źródłowym
Korzystając z kompletnego pliku symboli, DBH może wyświetlać informacje o wierszu źródłowym. Nie wymaga to dostępu do żadnych plików źródłowych, ponieważ te informacje są przechowywane w samych plikach symboli.
W tym miejscu polecenie wiersza wyświetla adres szesnastkowy instrukcji binarnych odpowiadający określonej linii źródłowej i wyświetla symbole skojarzone z tym wierszem. (W tym przykładzie nie ma żadnych symboli skojarzonych z wierszem).
dbh [1000000]: line myprogram.cpp#767
file : e:\mydirectory\src\myprogram.cpp
line : 767
addr : 1006191
key : 0000000000000000
disp : 0
W tym miejscu polecenie srclines wyświetla pliki obiektów skojarzone z określonym wierszem źródłowym:
dbh [1000000]: srclines myprogram.cpp 767
0x1006191: e:\mydirectory\objchk\amd64\myprogram.obj
line 767 e:\mydirectory\src\myprogram.cpp
Zwróć uwagę, że dane wyjściowe srclines są podobne do danych wyjściowych polecenia debugera ln (list najbliższych symboli).
Wyświetlanie typu danych
Polecenie type może służyć do wyświetlania informacji o typie danych. W tym miejscu są wyświetlane dane dotyczące typu 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
Wartość wyświetlana po "tagu" określa charakter tego typu danych. W tym przypadku SymTagTypedef wskazuje, że ten typ został zdefiniowany przy użyciu instrukcji typedef .
Używanie wyimaginowanych symboli
Polecenie add może dodać wyimaginowany symbol do załadowanego modułu. Rzeczywisty plik symboli nie został zmieniony; zmienia się tylko obraz tego pliku w pamięci DBH.
Polecenie add może być przydatne, jeśli chcesz tymczasowo zastąpić symbole skojarzone z danym zakresem adresów. W poniższym przykładzie część zakresu adresów skojarzona z modułem MyModule!main jest zastępowana przez wyimaginowany symbol MyModule!magic.
Poniżej przedstawiono sposób wyświetlania modułu przed dodaniu wyimaginowanego symbolu. Należy pamiętać, że funkcja main rozpoczyna się od 0x0042CC56 i ma rozmiar 0x42B. Dlatego gdy polecenie addr jest używane z adresem 0x0042CD10, rozpoznaje ten adres jako leżący w granicach funkcji main:
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
Symbol magic jest teraz dodawany pod adresem 0x0042CD00, z rozmiarem 0x10 bajtów. Gdy używane jest polecenie enum, ustawiany jest wysoki bit w indeksie, co wskazuje, że jest to symbol wyimaginowany.
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
Gdy używane jest polecenie addr, wyszukiwane są wszystkie symbole, których zakresy zawierają określony adres. Ponieważ to wyszukiwanie rozpoczyna się od określonego adresu i jest uruchamiane wstecz, adres 0x004CD10 jest teraz skojarzony z magią. Z drugiej strony adres 0x004CD40 jest nadal skojarzony z main, ponieważ leży poza zakresem magic. Należy również zauważyć, że tag SymTagCustom wskazuje wyimaginowany symbol:
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
Na koniec polecenie del może usunąć symbol magic, przywracając wszystkie symbole do ich oryginalnych zakresów.
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