x (проверка символов)
Команда x отображает символы во всех контекстах, которые соответствуют указанному шаблону.
x [Options] Module!Symbol
x [Options] *
Параметры
Параметры задает параметры поиска символов. Можно использовать один или несколько следующих параметров:
/0
Отображает только адрес каждого символа.
/1
Отображает только имя каждого символа.
/2
Отображает только адрес и имя каждого символа (а не тип данных).
/D
Отображает выходные данные с помощью языка разметки отладчика.
/t
Отображает тип данных каждого символа, если тип данных известен.
/v
Отображает тип символа (локальный, глобальный, параметр, функция или неизвестно) каждого символа. Этот параметр также отображает размер каждого символа. Размер символа функции — это размер функции в памяти. Размер других символов — это размер типа данных, который представляет символ. Размер всегда измеряется в байтах и отображается в шестнадцатеричном формате.
/s Size
Отображение только этих символов, размер которых в байтах равен значению Size. Размер символа функции — это размер функции в памяти. Размер других символов — это размер типа данных, который представляет символ. Символы, размер которых не может быть определен, всегда отображаются. Размер должен быть целым числом ненулевого.
/q
Отображает имена символов в кавычки.
/p
Не удаляет пробел перед открывающей скобкой, когда отладчик отображает имя функции и его аргументы. Такой вид отображения может упростить копирование имен функций и аргументов из экрана x в другое расположение.
/f
Отображает размер данных функции.
/d
Отображает размер данных.
/a
Сортирует отображение по адресу в порядке возрастания.
/A
Сортирует отображение по адресу в порядке убывания.
/n
Сортирует отображаемое по имени в порядке возрастания.
/N
Сортирует отображаемое по имени в порядке убывания.
/z
Сортирует отображение по размеру в порядке возрастания.
/Z
Сортирует отображение по размеру в порядке убывания.
Модуль
Указывает модуль для поиска. Этот модуль может быть файлом .exe, .dll или .sys. Модуль может содержать различные подстановочные знаки и описатели. Дополнительные сведения о синтаксисе см. в разделе "Синтаксис подстановочных знаков строки".
Символ
Указывает шаблон, который должен содержать символ. Символ может содержать различные подстановочные знаки и описатели. Дополнительные сведения о синтаксисе см. в разделе "Синтаксис подстановочных знаков строки".
Так как этот шаблон соответствует символу, совпадение не учитывает регистр, а один ведущий символ подчеркивания (_) представляет любое количество ведущих подчеркивания. Вы можете добавить пробелы в символ, чтобы указать имена символов, которые содержат пробелы (например, "оператор new" или "Template<A, B>") без использования подстановочных знаков.
Среда
Позиция | Description |
---|---|
Режимы | Режим пользователя, режим ядра |
Целевые объекты | Динамический, аварийный дампа |
Платформы | Все |
Замечания
Следующая команда находит все символы в 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 (Display Local Variables).
В следующем примере показаны параметры /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> >