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


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 раз. В последнем подсчете сводка по поведению этой функции показывает количество вызовов, наименьшее количество инструкций в одном выполнении, наибольшее число инструкций в одном выполнении и среднее число инструкций за выполнение.

Если выполняются какие-либо системные вызовы, они отображаются в счетчике и снова отображаются в конце выходных данных команды.