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


Отладчик среды выполнения (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.

Аргумент параметр может иметь одно из следующих значений:

attach

Выводит список доменов приложений процесса и приглашает пользователя выбрать домен, к которому требуется подключиться.

detach

Выводит список доменов приложений процесса и приглашает пользователя выбрать домен, от которого требуется отключиться.

0

Выводит список доменов приложений процесса.

1

Выводит список доменов приложений и сборок процесса.

as[sociatesource] {s|b идентификатор_точки_останова} имя_файла

Связывает указанный файл с текущим указателем кадра стека (параметр s) или заданной точкой останова (параметр b).

a[ttach] pid

Подключает отладчик к запущенному процессу. Если в данный момент отлаживается какая-либо программа, Cordbg.exe прекращает ее и пытается подключиться к процессу, указанному в аргументе pid . pid — это идентификационный номер процесса, который может быть указан в десятичном или шестнадцатеричном формате.

b[reak] [[файл:] номер_строки] |

[[ класс::] функция [:смещение]]

Задает или отображает точки останова. Если аргументы отсутствуют, будет выведен текущий список точек останова, иначе будет задана новая точка останова в указанном расположении. Точка останова может быть задана номером строки в текущем исходном файле, номером строки в файле, заданном полным именем, или в методе, заданном классом и необязательным смещением.

Точка останова сохраняется во всех запусках сеанса. Вместо команды break можно использовать команду stop.

Ссылки отображаются непривязанными, если расположение указанной точки останова не может быть привязано к коду. Отсутствие привязки точки останова означает, что код расположения точки останова еще не загружен. Это может произойти по различным причинам, например из-за ошибки в имени файла или класса (имена зависят от регистра). Кроме того, точки останова не будут привязаны, если они задаются до запуска приложений. Привязка точки останова происходит при загрузке самого кода. При загрузке модуля отладчик пытается привязать все непривязанные точки останова.

ca[tch] [событие]

Отображает список типов событий или настраивает отладчик на остановку при возникновении указанного события. Если аргумент не задан, выводится список типов событий, в котором типы событий, вызывающие остановку отладчика, снабжены пометкой "on", а игнорируемые типы событий — пометкой "off". Если аргумент указан, он задает тип события, при возникновении которого отладчик останавливается. По умолчанию отладчик останавливается только на необработанных событиях исключений (т. н. исключениях второго шанса). Типы событий, при возникновении которых отладчик останавливается, сохраняются до конца сеанса. Чтобы отладчик не останавливался на определенном событии, используйте команду ignore.

Аргумент событие может принимать одно из следующих значений.

e[ xceptions] [тип_исключения]

Добавляет тип исключения в список перехватываемых исключений первого шанса. Если тип исключения не указан, будут перехватываться все исключения первого шанса. Тип исключения задается с учетом регистра, например System.ArgumentException.

u[ nhandled]

Необработанные исключения

c[ lass]

События загрузки классов

m[ odule]

События загрузки модулей

t[ hread]

События запуска потока

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.

a6zb7c8d.alert_note(ru-ru,VS.90).gifПримечание.
Для функций-членов первым аргументом должен быть объект класса или производного класса, которому принадлежит функция-член.

g[o] [счетчик]

См. cont.

h[elp] [команда ...]

Выводит описание указанных команд. Если аргументы не заданы, будет выведен список команд отладчика. Вместо команды help можно использовать команду ?.

ig[nore] [событие]

Отображает список типов событий или указывает отладчику игнорировать указанное событие. Если аргумент событие не задан, выводится список типов событий, в котором игнорируемые типы событий снабжены пометкой "off", а типы событий, вызывающие остановку отладчика, — пометкой "on". Если аргумент задан, то он задает тип события, игнорируемого отладчиком. Чтобы задать тип события, при возникновении которого отладчик будет останавливаться, используйте команду catch.

Аргумент событие может принимать одно из следующих значений:

e[ xceptions] [тип_исключения]

Добавляет тип исключения в список игнорируемых исключений первого шанса. Если тип исключения не указан, будут игнорироваться все исключения первого шанса. Тип исключения задается с учетом регистра, например System.ArgumentException.

u[ nhandled]

Необработанные исключения

c[ lass]

События загрузки классов

m[ odule]

События загрузки модулей

t[ hread]

События запуска потока

i[n] [счетчик]

См. step.

k[ill]

Останавливает текущий процесс. Отладчик остается активным для обработки дальнейших команд.

l[ist] параметр

Выводит список загруженных модулей, классов или глобальных функций.

Аргумент параметр может иметь одно из следующих значений:

mod

Выводит список загруженных модулей процесса.

cl

Выводит список загруженных классов процесса.

fu

Выводит список глобальных функций всех модулей процесса.

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.

>имя_файла

Записывает все выполненные команды в файл имя_файла. Если имя_файла не указано, запись команд в файл прекратится.

<имя_файла

Считывает и выполняет команды, записанные в файле имя_файла.

a6zb7c8d.alert_note(ru-ru,VS.90).gifПримечание.

Команды программы 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]

См. также

Ссылки

Инструменты .NET Framework

Командная строка пакета SDK