Udostępnij przez


Dodatkowe przykłady dbH

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