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


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> >

См. также

Проверка символов

dv (отображение локальных переменных)