wt (данные трассировки и контрольных значений)
Команда wt выполняется через всю функцию, а затем отображает статистику при выполнении этой команды в начале вызова функции.
wt [WatchOptions] [= StartAddress] [EndAddress]
Параметры
WatchOptions
Указывает способ изменения отображения. Можно использовать любой из следующих вариантов.
Параметр | Действие |
---|---|
-lГлубина |
(Только в пользовательском режиме) Указывает максимальную глубину отображаемых вызовов. Все вызовы, уровни глубины которых по крайней мере глубже начальной точки, выполняются автоматически. |
Модуль -m |
(Только в пользовательском режиме) Ограничивает отображение кодом внутри указанного модуля, а также первым уровнем вызовов, выполненных из этого модуля. Вы можете включить несколько параметров -m для отображения кода из нескольких модулей и ни одного другого модуля. |
Модуль -i |
(Только в пользовательском режиме) Игнорирует любой код в указанном модуле. Можно включить несколько параметров -i, чтобы игнорировать код из нескольких модулей. При использовании параметра -m отладчик игнорирует все параметры -i. |
-Ni |
(Только в пользовательском режиме) Не отображает ни одну запись в коде, которая игнорируется из-за параметра -m или -i. |
-Nc |
Не отображает сведения об отдельных звонках. |
-Ns |
Не отображает сводную информацию. |
-Nw |
Не отображает предупреждения во время трассировки. |
-Оа |
(Только в пользовательском режиме) Отображает фактический адрес сайтов звонков. |
-or |
(Только в пользовательском режиме) Отображает возвращаемые значения регистра вызываемой функции, используя в качестве основы радикс по умолчанию. |
-Или |
(Только в пользовательском режиме) Отображает возвращаемые значения регистра вызываемой функции в соответствующем типе для каждого возвращаемого значения. |
StartAddress
Указывает адрес, с которого начинается выполнение отладчика. Если вы не используете StartAddress, выполнение начинается с инструкции, на которую указывает указатель инструкции. Дополнительные сведения о синтаксисе см. в разделе Синтаксис адреса и диапазона адресов.
EndAddress
Указывает адрес, на котором заканчивается трассировка. Если вы не используете EndAddress, выполняется одна инструкция или вызов функции.
Среда
Режимы |
Пользовательский режим, режим ядра |
Целевые объекты |
Только динамическая отладка |
Платформы |
Пользовательский режим: все режимы ядра: только на основе x86 |
Дополнительные сведения
Дополнительные сведения о выполнении команды wt и обзор связанных команд см. в разделе Управление целевым объектом.
Комментарии
Команда wt полезна, если требуется информация о поведении конкретной функции, но вы не хотите выполнять ее пошагово. Вместо этого перейдите к началу этой функции и выполните команду wt .
Если счетчик программы находится в точке, соответствующей символу (например, началу функции или точке входа в модуль), команда wt выполняет трассировку, пока не достигнет текущего возвращаемого адреса. Если счетчик программы находится в инструкции вызова , команда wt выполняет трассировку, пока не вернется в текущее расположение. Эта трассировка профилируется в окне Команда отладчика вместе с выходными данными, описывающими различные вызовы, встречающиеся командой.
Если команда wt выполняется где-то, отличном от начала функции, она ведет себя как команда p (шаг). Однако если указать EndAddress, выполнение продолжается до тех пор, пока не будет достигнут этот адрес, даже если это выполнение включает в себя множество шагов программы и вызовов функций.
При отладке в исходном режиме следует выполнять трассировку в функцию только до точки, где отображается открывающая скобка текста функции. Затем можно использовать команду wt . (Обычно проще вставить точку останова в первую строку функции или использовать отладку | Запустите до курсора, а затем используйте команду wt .)
Так как выходные данные из wt могут быть длинными, для записи выходных данных может потребоваться использовать файл журнала.
В следующем примере показан типичный файл журнала.
0:000> l+ Source options set to show source lines
Source options are f:
1/t - Step/trace by source line
2/l - List source line for LN and prompt
4/s - List source code at prompt
8/o - Only show source code at prompt
0:000> p Not yet at the function call: use "p"
> 44: minorVariableOne = 12;
0:000> p
> 45: variableOne = myFunction(2, minorVariable);
0:000> t At the function call: now use "t"
MyModule!ILT+10(_myFunction):
0040100f e9cce60000 jmp MyModule!myFunction (0040f6e0)
0:000> t
> 231: {
0:000> wt At the function beginning: now use "wt"
Tracing MyModule!myFunction to return address 00401137
105 0 [ 0] MyModule!myFunction
1 0 [ 1] MyModule!ILT+1555(_printf)
9 0 [ 1] MyModule!printf
1 0 [ 2] MyModule!ILT+370(__stbuf)
11 0 [ 2] MyModule!_stbuf
1 0 [ 3] MyModule!ILT+1440(__isatty)
14 0 [ 3] MyModule!_isatty
50 15 [ 2] MyModule!_stbuf
17 66 [ 1] MyModule!printf
1 0 [ 2] MyModule!ILT+980(__output)
59 0 [ 2] MyModule!_output
39 0 [ 3] MyModule!write_char
111 39 [ 2] MyModule!_output
39 0 [ 3] MyModule!write_char
....
11 0 [ 5] kernel32!__SEH_epilog4
54 11675 [ 4] kernel32!ReadFile
165 11729 [ 3] MyModule!_read
100 11895 [ 2] MyModule!_filbuf
91 11996 [ 1] MyModule!fgets
54545 83789 [ 0] MyModule!myFunction
1 0 [ 1] MyModule!ILT+1265(__RTC_CheckEsp)
2 0 [ 1] MyModule!_RTC_CheckEsp
54547 83782 [ 0] MyModule!myFunction
112379 instructions were executed in 112378 events (0 from other threads)
Function Name Invocations MinInst MaxInst AvgInst
MyModule!ILT+1265(__RTC_CheckEsp) 1 1 1 1
MyModule!ILT+1440(__isatty) 21 1 1 1
MyModule!ILT+1540(__ftbuf) 21 1 1 1
....
ntdll!memcpy 24 1 40 19
ntdll!memset 2 29 29 29
23 system calls were executed
Calls System Call
23 ntdll!KiFastSystemCall
В списке трассировки первое число указывает количество выполненных инструкций, второе — количество инструкций, выполненных дочерними процессами функции, а третье число (в квадратных скобках) — глубину функции в стеке (принимая начальную функцию за ноль). Отступ имени функции показывает глубину вызова.
В предыдущем примере MyModule!myFunction выполняет 105 инструкций перед вызовом нескольких подпрограмм, включая printf и fgets, а затем выполняет дополнительные инструкции 54545 после вызова этих функций, но перед выполнением еще нескольких вызовов. Однако в окончательном подсчете отображается, что myFunction выполняет 112 379 инструкций, так как это число включает все инструкции, выполняемые myFunction и его дочерними элементами. (Дочерние элементыmyFunction — это функции, вызываемые из myFunction прямо или косвенно.)
Обратите внимание, что в предыдущем примере ILT+1440 (__isatty) вызывается 21 раз. В последнем подсчете сводка по поведению этой функции показывает количество вызовов, наименьшее количество инструкций в одном выполнении, наибольшее число инструкций в одном выполнении и среднее число инструкций за выполнение.
Если выполняются какие-либо системные вызовы, они отображаются в счетчике и снова отображаются в конце выходных данных команды.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по