Поделиться через


Дополнительные примеры DBH

Ниже приведены дополнительные примеры команд, которые можно вывести в командной строке DBH.

Отображение закрытых символов и открытых символов

Если целевой объект является полным файлом символов, каждый открытый символ отображается дважды в файле: в таблице открытых символов и в данных закрытого символа. Копия в таблице открытых символов часто содержит различные украшения (префиксы и суффиксы). Дополнительные сведения см. в разделе "Общедоступные и частные символы".

DBH может отображать сведения об этом символе из данных частного символа, из открытой таблицы символов без украшений и из открытой таблицы символов с украшениями. Ниже приведен пример, в котором отображаются все три из них с помощью команды addr 414fe0 каждый раз.

При первом появлении этой команды в этом примере DBH использует параметры символов по умолчанию, поэтому результирующая информация поступает из данных закрытых символов. Обратите внимание, что эти сведения включают адрес, размер и тип данных функции fgets. Затем используется команда symopt +4000, которая включает параметр SYMOPT_PUBLICS_ONLY. Это приводит к тому, что DBH пропускает данные о закрытых символах, поэтому при выполнении команды addr 414fe0 dbH использует общедоступную таблицу символов, а сведения о размере или типе данных не отображаются для fget-функций. Наконец, используется команда symopt -2, отключение параметра SYMOPT_UNDNAME и включение элементов DBH. Когда надстройка 414fe0 запускается в последнее время, она отображает украшенную версию имени функции, _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 

Если был использован параметр командной строки -d, результаты будут отображаться с самого начала украшенное общедоступное имя.

Определение украшений определенного символа

DBH может определить украшения для определенного символа. Это может быть полезно при использовании в сочетании с программой, требующей указания символов с их украшениями, например PDBCopy.

Например, предположим, что файл символов mysymbols.pdb содержит символ, имя которого является MyFunction1. Чтобы найти украшенное имя, используйте следующую процедуру.

Сначала запустите DBH без параметра командной строки -d, а затем используйте команду symopt +4000, чтобы все сведения исходят из общедоступной таблицы символов:

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

mysymbols [1000000]: symopt +4000

Symbol Options: 0x10c13
Symbol Options: 0x14c13 

Затем используйте команду name или команду перечисления , чтобы отобразить адрес нужного символа:

mysymbols [1000000]: enum myfunction1 

 index            address     name
   2ab            102cb4e :   MyFunction1

Теперь используйте symopt -2, чтобы сделать украшения символов видимыми, а затем используйте команду addr с адресом этого символа:

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  

Это показывает, что украшенное имя символа _MyFunction1@4.

Декодирование украшений символов

Команду undec можно использовать для выявления смысла украшений символов C++. В следующем примере украшения, присоединенные к ?? _C@_03GGCAPAJC@Sep?$AA@ декодируются, чтобы указать, что это строка:

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

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

В следующих примерах декодирование украшений, присоединенных к трем именам функций, показыв их прототипы:

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) 

Команда undec не отображает сведения о начальных подчеркиваниях, префиксе __imp_ или конечных@ "адресных" украшениях, которые обычно находятся в именах функций.

Команду undec можно использовать с любой строкой, а не только именем символа в модуле, загруженном в данный момент.

Сортировка списка символов по адресу

Если вам просто нужен список символов, отсортированных в порядке адреса, можно запустить DBH в пакетном режиме и передать результаты команде сортировки . Значения адресов обычно начинаются в 18-м столбце каждой строки, поэтому следующая команда сортирует результаты по адресу:

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

Отображение сведений о строке источника

При использовании полного файла символов DBH может отображать сведения о исходной строке. Для этого не требуется доступ к исходным файлам, так как эти сведения хранятся в самих файлах символов.

Здесь команда строки отображает шестнадцатеричный адрес двоичных инструкций, соответствующих указанной исходной строке, и отображает символы, связанные с этой строкой. (В этом примере символы, связанные с строкой, отсутствуют.)

dbh [1000000]: line myprogram.cpp#767

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

Здесь команда srclines отображает файлы объектов, связанные с указанной исходной строкой:

dbh [1000000]: srclines myprogram.cpp 767

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

Обратите внимание, что выходные данные srclines похожи на команду отладчика ln (список ближайших символов).

Отображение типа данных

Команда типа может использоваться для отображения сведений о типе данных. Здесь отображаются данные о типе 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

Значение, указанное после тега, указывает характер этого типа данных. В этом случае SymTagTypedef указывает, что этот тип был определен с помощью инструкции typedef.

Использование мнимых символов

Команда add может добавить воображаемый символ в загруженный модуль. Фактический файл символов не изменяется; Изменяется только изображение этого файла в памяти DBH.

Команда добавления может быть полезна, если вы хотите временно переопределить, какие символы связаны с заданным диапазоном адресов. В следующем примере часть диапазона адресов, связанного с MyModule!main , переопределяется мнимым символом MyModule!magic.

Ниже показано, как модуль отображается перед добавлением мнимого символа. Обратите внимание, что основная функция начинается с 0x0042CC56 и имеет размер 0x42B. Поэтому, когда команда addr используется с адресом 0x0042CD10, он распознает этот адрес как в пределах границ основной функции:

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 

Теперь магия символов добавляется по адресу 0x0042CD00 с размером 0x10 байтов. При использовании команды перечисления устанавливается высокий бит в индексе, показывающий, что это мнимый символ:

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 

При использовании команды надстройки он ищет все символы, диапазоны которых включают указанный адрес. Так как этот поиск начинается с указанного адреса и выполняется назад, адрес 0x004CD10 теперь связан с магией. С другой стороны, адрес 0x004CD40 по-прежнему связан с основным, потому что он лежит за пределами диапазона магического символа. Обратите внимание также, что тег SymTagCustom указывает на мнимый символ:

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 

Наконец, команда del может удалить магию символов, возвращая все символы в их исходные диапазоны:

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