x (изучение символов)
Команда x отображает символы во всех контекстах, соответствующих указанному шаблону.
x [Options] Module!Symbol
x [Options] *
Параметры
Параметры Задает параметры поиска символов. Можно использовать один или несколько из следующих параметров:
/0
Отображает только адрес каждого символа.
/1
Отображает только имя каждого символа.
/2
Отображает только адрес и имя каждого символа (не тип данных).
/D
Отображает выходные данные с помощью языка разметки отладчика.
/T
Отображает тип данных каждого символа, если тип данных известен.
/V
Отображает тип символа (локальный, глобальный, параметр, функция или неизвестный) каждого символа. Этот параметр также отображает размер каждого символа. Размер символа функции — это размер функции в памяти. Размер других символов — это размер типа данных, который представляет символ. Размер всегда измеряется в байтах и отображается в шестнадцатеричном формате.
Размер /s
Отображение только тех символов, размер которых в байтах равен значению Size. Размер символа функции — это размер функции в памяти. Размер других символов — это размер типа данных, который представляет символ. Всегда отображаются символы, размер которых не удается определить. Размер должен быть ненулевым целым числом.
/Q
Отображает имена символов в кавычках.
/P
Пропускает пробел перед открывающей скобкой, когда отладчик отображает имя функции и ее аргументы. Этот вид отображения может упростить работу, если вы копируете имена функций и аргументы из отображения x в другое расположение.
/F
Отображает размер данных функции.
/D
Отображает размер данных.
/a
Сортирует отображение по адресу в порядке возрастания.
/A
Сортирует отображение по адресу в порядке убывания.
/N
Сортирует отображение по имени в порядке возрастания.
/N
Сортирует отображение по имени в порядке убывания.
/Z
Сортирует отображение по размеру в порядке возрастания.
/Z
Сортирует отображение по размеру в порядке убывания.
Модуль
Указывает модуль для поиска. Этот модуль может быть файлом .exe, .dll или .sys. Модуль может содержать различные подстановочные знаки и описатели. Дополнительные сведения о синтаксисе см. в разделе Синтаксис подстановочных знаков строки.
Символ
Указывает шаблон, который должен содержать символ. Символ может содержать различные подстановочные знаки и описатели. Дополнительные сведения о синтаксисе см. в разделе Синтаксис подстановочных знаков строки.
Так как этот шаблон сопоставляется с символом, совпадение не учитывает регистр, а один символ подчеркивания в начале (_) представляет любое количество символов подчеркивания в начале. Вы можете добавить пробелы в symbol, чтобы можно было указать имена символов, которые содержат пробелы (например, "оператор new" или "Шаблон<A, B>"), не используя подстановочные знаки.
Среда
Элемент | Описание |
---|---|
Режимы | Пользовательский режим, режим ядра |
Цели | Динамический аварийный дамп |
Платформы | Все |
Комментарии
Следующая команда находит все символы в MyModule, содержащие строку spin.
0:000> x mymodule!*spin*
Следующая команда быстро находит символы DownloadMinor и DownloadMajor в MyModule.
0:000> x mymodule!downloadm??or
Вы также можете отобразить все символы в MyModule с помощью следующей команды.
0:000> x mymodule!*
Предыдущие команды также заставляют отладчик перезагрузить сведения о символах из MyModule. Если вы хотите перезагрузить символы в модуле с минимальным отображением, используйте следующую команду.
0:000> x mymodule!*start*
Некоторые символы всегда содержат строку "start". Таким образом, предыдущая команда всегда отображает некоторые выходные данные, чтобы убедиться, что команда работает. Но предыдущая команда позволяет избежать чрезмерной длины отображения x mymodule!*.
На экране отображается начальный адрес каждого символа и полное имя символа. Если символом является имя функции, отображение также включает список ее типов аргументов. Если символ является глобальной переменной, отображается его текущее значение.
Существует еще один особый случай команды x . Чтобы отобразить адреса и имена всех локальных переменных для текущего контекста, используйте следующую команду.
0:000> x *
Примечание В большинстве случаев доступ к локальным переменным невозможен, если не были загружены закрытые символы. Дополнительные сведения об этой ситуации см. в разделе dbgerr005: требуются закрытые символы. Чтобы отобразить значения локальных переменных, используйте команду dv (Отобразить локальные переменные).
В следующем примере показаны параметры /0, /1 и /2 .
0:000:x86> x /0 MyApp!Add*
00b51410
00b513d0
0:000:x86> x /1 MyApp!Add*
MyApp!AddThreeIntegers
MyApp!AddTwoIntegers
0:000:x86> x /2 MyApp!Add*
00b51410 MyApp!AddThreeIntegers
00b513d0 MyApp!AddTwoIntegers
Параметры /0, /1 и /2 полезны, если вы хотите использовать выходные данные команды x в качестве входных данных для команды FOREACH .
.foreach ( place { x /0 MyApp!*MySym*} ) { .echo ${place}+0x18 }
В следующем примере показан параметр /f , используемый для фильтрации функций в модуле notepad.exe.
0:000> x /f /v notepad!*main*
prv func 00000001`00003340 249 notepad!WinMain (struct HINSTANCE__ *, struct HINSTANCE__ *, char *, int)
prv func 00000001`0000a7b0 1c notepad!WinMainCRTStartup$filt$0 (void)
prv func 00000001`0000a540 268 notepad!WinMainCRTStartup (void)
При использовании параметра /v в первом столбце отображается тип символа (локальный, глобальный, параметр, функция или неизвестно). Второй столбец — это адрес символа. Третий столбец — это размер символа в байтах. В четвертом столбце показано имя модуля и имя символа. В некоторых случаях за этим отображением следует знак равенства (=), а затем тип данных символа. Также отображается источник символа (общедоступная или полная информация о символе).
kd> x /v nt!CmType*
global 806c9e68 0 nt!CmTypeName = struct _UNICODE_STRING []
global 806c9e68 150 nt!CmTypeName = struct _UNICODE_STRING [42]
global 806c9e68 0 nt!CmTypeName = struct _UNICODE_STRING []
global 805bd7b0 0 nt!CmTypeString = unsigned short *[]
global 805bd7b0 a8 nt!CmTypeString = unsigned short *[42]
В предыдущем примере размер задается в шестнадцатеричном формате, а тип данных — в десятичном формате. Таким образом, в последней строке предыдущего примера тип данных представляет собой массив из 42 указателей на неподписанные короткие целые числа. Размер этого массива составляет 42*4 = 168, а 168 отображается в шестнадцатеричном формате как 0xA8.
Параметр /sSize можно использовать для отображения только тех символов, размер которых в байтах является определенным значением. Например, команду в предыдущем примере можно ограничить символами, представляющими объекты, размер которых 0xA8.
kd> x /v /s a8 nt!CmType*
global 805bd7b0 a8 nt!CmTypeString = unsigned short *[42]
Работа с типами данных
Параметр /t приводит к тому, что отладчик отображает сведения о типе данных каждого символа. Обратите внимание, что для многих символов эти сведения отображаются даже без параметра /t . При использовании параметра /t сведения о типе данных для таких символов отображаются дважды.
0:001> x prymes!__n*
00427d84 myModule!__nullstring = 0x00425de8 "(null)"
0042a3c0 myModule!_nstream = 512
Type information missing error for _nh_malloc
004021c1 myModule!MyStructInstance = struct MyStruct
00427d14 myModule!_NLG_Destination = <no type information>
0:001> x /t prymes!__n*
00427d84 char * myModule!__nullstring = 0x00425de8 "(null)"
0042a3c0 int myModule!_nstream = 512
Type information missing error for _nh_malloc
004021c1 struct MyStruct myModule!MyStructInstance = struct MyStruct
00427d14 <NoType> myModule!_NLG_Destination = <no type information>
Команда x отобразит экземпляр типа .
0:001> x foo!MyClassInstance
00f4f354 foo!MyClassInstance = 0x00f78768
Команда x не отображает ничего на основе только имени типа.
0:001> x foo!MyClass
0:001>
Для отображения сведений о типе с помощью имени типа рекомендуется использовать dt (тип отображения), который предоставляет сведения как для типов, так и для экземпляров типов:
0:001> dt foo!MyClass
+0x000 IntMemberVariable : Int4B
+0x004 FloatMemberVariable : Float
+0x008 BoolMemberVariable : Bool
+0x00c PtrMemberVariable : Ptr32 MyClass
Работа с шаблонами
Вы можете использовать подстановочные знаки с командой x для отображения классов шаблонов, как показано в этом примере.
0:001> x Fabric!Common::ConfigEntry*TimeSpan?
000007f6`466a2f9c Fabric!Common::ConfigEntry<Common::TimeSpan>::ConfigEntry<Common::TimeSpan> (void)
000007f6`466a3020 Fabric!Common::ConfigEntry<Common::TimeSpan>::~ConfigEntry<Common::TimeSpan> (void)
При работе с шаблонами рекомендуется использовать команду dt (тип отображения ), так как команда x не отображает отдельные элементы класса шаблона.
0:001> dt foo!Common::ConfigEntry<Common::TimeSpan>
+0x000 __VFN_table : Ptr64
+0x008 componentConfig_ : Ptr64 Common::ComponentConfig
+0x010 section_ : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >
+0x038 key_ : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по