Отладчик среды выполнения (Cordbg.exe)
Обновлен: Ноябрь 2007
Отладчик среды выполнения служит для поиска и исправления ошибок в программах, работающих в общеязыковой среде выполнения .NET Framework. Этот инструмент использует отладочный API-интерфейс среды выполнения. Исходный код программы Cordbg.exe поставляется в качестве примера приложения. Разработчики могут анализировать этот код для обучения работе со службами отладки. На данный момент программа Cordbg.exe может отлаживать только управляемый код, отладка неуправляемого кода не поддерживается.
Первая строка приведенного ниже синтаксиса позволяет начать сеанс Cordbg.exe. Вторая строка используется в строке (cordbg)внутри сеанса Cordbg.exe.
cordbg [ProgramName[Program arguments]][optional arguments ]
command [command arguments]
Параметры
Команда |
Описание |
---|---|
ap[pdomainenum] [параметр] |
Перечисляет все домены приложений, сборки и модули в рамках текущего процесса. Если аргумент параметр не указан, будут перечислены все домены приложений, сборки и модули текущего процесса. Для продолжения выполнения после отключения или подключения требуется ввести команду go. Аргумент параметр может иметь одно из следующих значений:
|
as[sociatesource] {s|b идентификатор_точки_останова} имя_файла |
Связывает указанный файл с текущим указателем кадра стека (параметр s) или заданной точкой останова (параметр b). |
a[ttach] pid |
Подключает отладчик к запущенному процессу. Если в данный момент отлаживается какая-либо программа, Cordbg.exe прекращает ее и пытается подключиться к процессу, указанному в аргументе pid . pid — это идентификационный номер процесса, который может быть указан в десятичном или шестнадцатеричном формате. |
b[reak] [[файл:] номер_строки] | [[ класс::] функция [:смещение]] |
Задает или отображает точки останова. Если аргументы отсутствуют, будет выведен текущий список точек останова, иначе будет задана новая точка останова в указанном расположении. Точка останова может быть задана номером строки в текущем исходном файле, номером строки в файле, заданном полным именем, или в методе, заданном классом и необязательным смещением. Точка останова сохраняется во всех запусках сеанса. Вместо команды break можно использовать команду stop. Ссылки отображаются непривязанными, если расположение указанной точки останова не может быть привязано к коду. Отсутствие привязки точки останова означает, что код расположения точки останова еще не загружен. Это может произойти по различным причинам, например из-за ошибки в имени файла или класса (имена зависят от регистра). Кроме того, точки останова не будут привязаны, если они задаются до запуска приложений. Привязка точки останова происходит при загрузке самого кода. При загрузке модуля отладчик пытается привязать все непривязанные точки останова. |
ca[tch] [событие] |
Отображает список типов событий или настраивает отладчик на остановку при возникновении указанного события. Если аргумент не задан, выводится список типов событий, в котором типы событий, вызывающие остановку отладчика, снабжены пометкой "on", а игнорируемые типы событий — пометкой "off". Если аргумент указан, он задает тип события, при возникновении которого отладчик останавливается. По умолчанию отладчик останавливается только на необработанных событиях исключений (т. н. исключениях второго шанса). Типы событий, при возникновении которых отладчик останавливается, сохраняются до конца сеанса. Чтобы отладчик не останавливался на определенном событии, используйте команду ignore. Аргумент событие может принимать одно из следующих значений.
|
conn[ect] machine_nameport |
Для проектов интеллектуальных устройств. Устанавливает подключение к удаленному устройству, в котором запущено приложение .NET Compact Framework.
ПараметрОпределение
machine_nameОбязательный параметр. Имя или IP-адрес удаленного компьютера.
Port Обязательный параметр. Порт, используемый для подключения к удаленному компьютеру.
|
cont [счетчик] |
Возобновляет выполнение программы. Если аргумент не задан, выполнение программы продолжается один раз. Если аргумент задан, выполнение программы продолжается указанное число раз. Эта команда может применяться для продолжения выполнения программы после остановки отладчика из-за исключений, событий загрузки классов или в точке останова. Вместо команды cont можно использовать команду go. |
del[ete] [идентификатор_точки_останова, ...] |
Удаляет точки останова. Если аргумент не задан, будут удалены все точки останова. Если задан один или несколько аргументов идентификатор_точки_останова, удаляются только указанные точки останова. Идентификаторы точек останова можно получить с помощью команды break или stop. Вместо команды delete можно использовать команду remove. |
de[tach] |
Отключает отладчик от текущего процесса. Процесс автоматически продолжается так, как если бы отладчик не был подключен к нему. |
dis[assemble] [0xадрес][{+|-} дельта] [количество_строк] |
Отображает дизассемблированные инструкции в машинном коде для текущего указателя на инструкцию или адреса, если он указан. По умолчанию отображаются пять инструкций. Количество дополнительно отображаемых инструкций до и после текущего указателя на инструкцию или адреса задается необязательным аргументом количество_строк. Последнее указанное значение аргумента количество_строк становится значением по умолчанию для текущего сеанса. Значение необязательного аргумента дельта задает число, которое будет прибавлено к текущему указателю на инструкцию или адресу для определения начала дизассемблирования. |
d[own] [счетчик] |
Перемещает указатель кадра стека вниз по стеку к кадрам, вызванным текущим кадром, для проверки. Если аргумент не задан, указатель кадра стека сместится вниз на один кадр. Если аргумент задан, указатель кадра стека сместится вниз на указанное количество кадров. Если данные исходного уровня недоступны, инструментом отображается исходная строка кадра. Эта команда обычно используется совместно с командой up. |
du[mp] адрес [счетчик] |
Создает дамп блока памяти в шестнадцатеричном или десятичном формате в зависимости от режима отладчика (см. mode). Адрес блока памяти задается аргументом адрес. Аргумент счетчик задает объем блока в байтах. |
ex[it] |
Завершает текущий процесс и завершает работу отладчика. Вместо команды exit можно использовать команду quit. |
f[unceval] [класс::] функция [ арг_0 арг_1 ...арг_n] |
Вычисляет значение указанной функции в текущем потоке. Новый объект сохраняется в переменной $result и может быть использован в дальнейших вычислениях. Аргументами могут быть другие переменные, 4-байтовые целые числа и константы Null, True и False.
Примечание.
Для функций-членов первым аргументом должен быть объект класса или производного класса, которому принадлежит функция-член.
|
g[o] [счетчик] |
См. cont. |
h[elp] [команда ...] |
Выводит описание указанных команд. Если аргументы не заданы, будет выведен список команд отладчика. Вместо команды help можно использовать команду ?. |
ig[nore] [событие] |
Отображает список типов событий или указывает отладчику игнорировать указанное событие. Если аргумент событие не задан, выводится список типов событий, в котором игнорируемые типы событий снабжены пометкой "off", а типы событий, вызывающие остановку отладчика, — пометкой "on". Если аргумент задан, то он задает тип события, игнорируемого отладчиком. Чтобы задать тип события, при возникновении которого отладчик будет останавливаться, используйте команду catch. Аргумент событие может принимать одно из следующих значений:
|
i[n] [счетчик] |
См. step. |
k[ill] |
Останавливает текущий процесс. Отладчик остается активным для обработки дальнейших команд. |
l[ist] параметр |
Выводит список загруженных модулей, классов или глобальных функций. Аргумент параметр может иметь одно из следующих значений:
|
m[ode] [[имя_режима {0|1} ] |
Задает и отображает режимы отладчика для различных функциональных возможностей отладчика. Задайте имя_режима и цифру 1, чтобы включить режим, или 0, чтобы отключить. Если аргументы не заданы, будет выведен список параметров текущего режима. Режимы сохраняются в реестре Windows в промежутках между запусками Cordbg.exe. Дополнительные сведения см. в таблице аргументов режимов отладчика. |
newo[bj] класс |
Создает новый объект с помощью текущего потока. Новый объект сохраняется в переменной $result и может быть использован в дальнейших вычислениях. |
newobjnc класс |
Создает новый объект с помощью текущего потока без запуска конструктора для объекта. Новый объект инициализируется нулем. Новый объект сохраняется в переменной $result и может быть использован в дальнейших вычислениях. |
news[tr] строка |
Создает новую строку с помощью текущего потока. Новый объект сохраняется в переменной $result и может быть использован в дальнейших вычислениях. |
n[ext] [счетчик] |
Вызывает переход к исполнению следующей строки исходного кода без захода в вызываемые функции. Если аргумент не задан, осуществляется переход на одну строку исходного кода. Если аргумент задан, он определяет количество выполняемых строк исходного кода. Вместо команды next можно использовать команду so. |
ns[ingle] [счетчик] |
Вызывает переход к исполнению одной или нескольких инструкций без захода в вызываемые функции. Если аргумент не задан, выполняется одна инструкция. Если аргумент счетчик задан, он определяет количество выполняемых инструкций. |
o[ut] [счетчик] |
Вызывает выход из текущей функции. Если аргумент не задан, будет осуществлен однократный выход из текущей функции. Если аргумент задан, он определяет количество последовательных выходов из функции. |
pa[th] [новый_путь] |
Отображает или задает путь для поиска исходных файлов и символов отладки. Если аргумент не задан, будет отображен текущий путь. Если аргумент новый_путь задан, он определяет новый путь для поиска исходных файлов и символов отладки. Этот путь сохраняется в реестре Windows до следующего сеанса. |
p[rint] [имя_переменной] |
Отображает одну или несколько локальных переменных и их значения. Если аргумент не задан, будут отображены все локальные переменные и их значения. Если аргумент задан, он определяет имя переменной, значение которой будет отображено. Дополнительные сведения см. в примерах в разделе Использование команды print. |
pro[cessenum] |
Перечисляет все управляемые процессы и домены приложений для каждого из них. |
q[uit] |
См. exit. |
ref[reshsource] [исходный_файл] |
Повторно загружает исходный код для указанного исходного файла. Повторно загружаемый исходный файл должен быть частью текущей исполняемой программы. После задания пути к исходным файлам командой path можно использовать команду refreshsource для получения недостающего исходного кода. |
regd[efault] [force] |
Объявляет Cordbg.exe JIT-отладчиком по умолчанию. Если уже зарегистрирован другой отладчик, команда не выполняет никаких действий. Чтобы переопределить ранее зарегистрированный JIT-отладчик, задайте аргумент force. |
reg[isters] |
Отображает содержимое регистров для текущего потока. |
rem[ove] [идентификатор_точки_останова, ...] |
См. delete. |
re[sume] [~] [tid] |
Возобновляет выполнение потока, заданного аргументом tid, после возобновления работы отладчика. Если задан аргумент ~, будет возобновлена работа всех потоков, кроме указанного. При отсутствии аргументов команда не выполняет никаких действий. |
r[un] [исполняемый_файл [аргументы]] |
Прекращает выполнение текущего процесса (если есть) и начинает новый процесс. Если не указан аргумент исполняемый_файл, будет запущена программа, выполнявшаяся ранее командой run. Если задан аргумент исполняемый_файл, указанная программа будет запущена с указанными необязательными аргументами аргументы. Если Cordbg.exe не обрабатывает события загрузки классов и модулей и запуска потоков (как это делается по умолчанию), программа будет остановлена на первой исполняемой инструкции основного потока. |
set переменная значение |
Присваивает переменной переменная указанное значение. Значение может быть литералом или именем другой переменной. Дополнительные сведения см. в примерах в разделе Использование команды set. |
setip номер_строки |
Указывает, что следующим будет выполнен оператор, расположенный в строке, имеющей заданный номер_строки. |
sh[ow] [счетчик] |
Отображает строки исходного кода. Если аргумент не задан, будут отображены пять строк исходного кода до и после текущей строки исходного кода. Если аргумент задан, будет отображено указанное количество строк до и после текущей строки. Последнее заданное значение аргумента счетчик становится значением по умолчанию для текущего сеанса. |
si [<счетчик>] |
См. step. |
so [<счетчик>] |
См. next. |
ss[ingle] [счетчик] |
Вызывает переход к исполнению одной или нескольких инструкций c заходом в вызываемые функции. Если аргумент не задан, выполняется одна инструкция. Если аргумент задан, он определяет количество выполняемых инструкций. |
s[tep] [счетчик] |
Вызывает переход к исполнению следующей строки исходного кода с заходом в вызываемые функции. Если аргумент не задан, осуществляется переход к следующей строке. Если аргумент задан, он определяет количество выполняемых строк исходного кода. Вместо команды step можно использовать команду si или in. |
stop [[файл:] номер_строки] | [[класс::] функция[:смещение]] | [=0xадрес] |
См. break. |
su[spend] [~] [tid] |
Приостанавливает выполнение потока, заданного аргументом tid, после возобновления работы отладчика. Если задан аргумент ~, будет приостановлена работа всех потоков, кроме указанного. При отсутствии аргументов команда не выполняет никаких действий. |
t[hreads] [tid] |
Отображает список потоков или задает текущий поток. Если аргумент не задан, будут отображены все имеющиеся потоки, в которых выполняется управляемый код. Если аргумент задан, указанный поток становится текущим. |
up [счетчик] |
Перемещает указатель кадра стека вверх по стеку к кадрам, вызвавшим текущий кадр, для проверки. Если аргумент не задан, указатель кадра стека сместится вверх на один кадр. Если аргумент задан, указатель кадра стека сместится вверх на указанное количество кадров. Если данные исходного уровня недоступны, инструментом отображается исходная строка кадра. |
w[here] [счетчик] |
Отображает трассировку стека для текущего потока. Если аргумент не задан, будет отображена полная трассировка стека. Если аргумент задан, он определяет количество отображаемых кадров стека. |
wr[itememory] адрес счетчик байт, ... |
Записывает указанные байты в целевой процесс. Место записи задается аргументом адрес. Аргумент счетчик задает число записываемых байтов. Аргумент байт представляет собой данные, записываемые в процесс. Если количество байтов в списке меньше, чем значение аргумента счетчик, то они будут скопированы повторно с начала списка. Если количество байтов в списке больше, чем значение аргумента счетчик, лишние данные не копируются. |
wt |
Выполняет инструкции приложения в машинном коде по шагам, начиная с текущей инструкции и печатая дерево вызовов по ходу выполнения. Инструмент печатает количество выполненных инструкций в машинном коде в каждой функции с трассировкой вызовов. Трассировка прекращается при достижении инструкции возврата той функции, из которой вызывалась команда. В конце трассировки отображается общее количество выполненных инструкций. Эта команда аналогична команде wt отладчика NT Symbolic Debugger, она может быть использована для базового анализа производительности. В данный момент подсчитывается только управляемый код. |
x имя_модуля ! искомая_строка |
Отображает символы указанного модуля, подходящие под шаблон, заданный аргументом искомая_строка. В строке искомая_строка можно указать звездочку (*), чтобы задать шаблон, которому удовлетворяет любая строка. Все символы после знака * будут проигнорированы. |
? [команда ...] |
См. help. |
>имя_файла |
Записывает все выполненные команды в файл имя_файла. Если имя_файла не указано, запись команд в файл прекратится. |
<имя_файла |
Считывает и выполняет команды, записанные в файле имя_файла. |
Примечание. |
---|
Команды программы Cordbg.exe зависят от регистра. Кроме того, у некоторых команд есть синонимы, то есть для выполнения одного и того же действия можно использовать любую из команд-синонимов. Например, задать точку останова можно как командой break, так и командой stop. |
Аргументы режимов
Аргументы режимов могут быть заданы минимальным количеством знаков, необходимым для однозначного определения режима. Например, команда "mode m 1" эквивалентна команде "mode moduleloads 1".
Аргумент |
Описание |
---|---|
AppDomainLoads |
Отображать домен приложения и события загрузки сборки. |
ClassLoads |
Отображать события загрузки классов. |
DumpMemoryInBytes |
Отображать содержимое памяти в виде байтов или двойных слов (DWORD). |
EmbededCLR |
Использовать отладчик для приложений .NET Compact Framework, работающих в интеллектуальных устройствах. Укажите 1, чтобы включить данный режим, или 0, чтобы отключить. |
EnhanceDiag |
Отображать подробные диагностические сведения. |
HexDisplay |
Отображать числа в шестнадцатеричном или десятичном формате. |
ILNatPrint |
Отображать смещение в промежуточном языке MSIL, или в машинном коде, или и в том и в другом. |
ISAll |
Заходить во все перехватчики при пошаговом выполнении. |
ISClinit |
Заходить в инициализаторы классов. |
ISExceptF |
Заходить в фильтры исключений. |
ISInt |
Заходить в пользовательские перехватчики. |
ISPolicy |
Заходить в политики контекста. |
ISSec |
Заходить в перехватчики безопасности. |
JitOptimizations |
Указывает, должен ли при JIT-компиляции создаваться легкий для отладки код. |
LoggingMessages |
Отображать сообщения журнала управляемого кода. |
ModuleLoads |
Отображать события загрузки модулей. |
SeparateConsole |
Указывает, создается ли для отлаживаемого процесса собственная консоль. |
ShowArgs |
Отображать аргументы методов в трассировке стека. |
ShowModules |
Отображать имена модулей в трассировке стека. |
ShowStaticsOnPrint |
Отображать статические поля для объектов. |
ShowSuperClassOnPrint |
Отображать содержимое базового класса для объекта. |
USAll |
Проходить через все неотображенные точки останова. |
USEpi |
Заходить в заключительные части методов. |
USPro |
Заходить во вводные части методов. |
USUnmanaged |
Заходить в неуправляемый код. |
Заметки
Следует компилировать программу с соответствующими флагами, зависящими от компилятора; в этом случае компилятор сгенерирует отладочные знаки. Дополнительные сведения об этих флагах см. в документации по компилятору. Отладка оптимизированных приложений возможна, но часть отладочной информации будет недоступна. Например, многие локальные переменные будут недоступны, а номера строк исходного кода будут неточны.
После компиляции приложения введите в командной строке команду cordbg, чтобы начать сеанс отладчика (см. следующий пример).
D:\Program Files\FrameworkSDK\Bin>cordbg
Microsoft (R) Common Language Runtime Test Debugger Shell. Version 2000.14.2100.0, Copyright (c) Microsoft Corp. 1998-2000
(cordbg)
Приглашение (cordbg) означает, что идет работа с отладчиком.
Для вызова требуемых функций во время сеанса работы с отладчиком используйте соответствующие команды и аргументы.
При запуске сеанса отладчика из командной строки можно дополнительно указать имя отлаживаемого приложения, аргументы программы и дополнительные аргументы. Дополнительные аргументы программы Cordbg.exe представляют собой обычные команды этой программы, но перед ними должен стоять восклицательный знак (!). Символ ! можно использовать в строке в качестве литерала, предварив его обратной косой чертой (\). Это необходимо при использовании команды x.
Если числовой аргумент команды начинается с префикса 0x, Cordbg.exe предполагает, что аргумент представлен в шестнадцатеричном формате. В противном случае предполагается, что аргумент представлен в десятичном формате.
Большинство команд программы Cordbg.exe может быть выполнено для всех управляемых потоков процесса сразу, для чего следует поставить перед командой звездочку (*). Команда будет выполнена в контексте каждого потока. Наиболее полезно предварять значком * команду w[here]. Например, команда *w напечатает трассировку стека всех управляемых потоков.
Дополнительные сведения о службах отладки среды выполнения см. в спецификации Enabling Profiling and Debugging. Кроме того, разработчикам программ следует ознакомиться с документами Debug Overview и Debug Reference, расположенными в папке Tools Developers Guide в комплекте поставки SDK (пакет средств разработки программного обеспечения) для Windows.
Примеры
Запуск сеанса Cordbg.exe
Следующая команда начинает сеанс Cordbg.exe для приложения MyApplication.exe с аргументами программы a и 2, а также следующими дополнительными командами: задание точки останова в MyApplication.cs на строке 42; возобновление приложения; отображение символов в MyApplication.exe, соответствующих шаблону 'SomeString'.
cordbg MyApplication.exe a 2 !b MyApplication.cs:42 !g !x MyApplication.exe\!SomeString
Запуск исполняемых файлов из сеанса Cordbg.exe
Следующая команда, введенная во время сеанса Cordbg.exe (в строке (cordbg) ), запускает исполняемый файл MyApplication.exe с аргументами программы a и 2.
run MyApplication.exe a 2
Использование команды print
Следующие команды демонстрируют применение точки в команде print для обращения к переменным, объявленным внутри объектов.
print obj.var1
print obj1.obj2.var1
Если класс расширяет другой класс, команда print отображает поля указанного класса и базового класса. Например, если в классе m1 определены поля a, b и c, а класс m2 расширяет m1 и содержит поля d, e и f, экземпляр myInstance класса m2 печатается следующим образом.
myInstance = <addr> <m2>
a = 1
b = 2
c = 3
m2::d = 4
m2::e = 5
m2::f = 6
Статические переменные класса можно указать, предварив имя переменной именем класса:
print MyClass::StaticVar1
print System::Boolean::True
Индексы массивов должны быть простыми выражениями. Приведенные ниже индексы массивов можно использовать с командой print.
print arr[1]
print arr[i]
print arr1[arr2[1]]
print md[1][5][myObject.a]
Следующие индексы массивов нельзя использовать с командой print, так как они не являются простыми выражениями.
print arr[i + 1]
print arr[i + 2]
Использование команды set
Команда set позволяет присвоить переменной литеральное значение или значение другой переменной. Ниже приведены допустимые примеры использования команды set.
set int1 0x2a
set float1 3.1415
set char1 'a'
set bool1 true
set obj1 0x12345678
set obj1 obj2
set obj1.m_length[obj1.m_height] obj3.m_length[2]