Дополнительные примеры 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