MDbg.exe (отладчик командной строки для .NET Framework)
Отладчик командной строки для платформы NET Framework помогает разработчикам программ и приложений в поиске и исправлении ошибок в программах, работающих в среде CLR платформы .NET Framework. Этот инструмент использует отладочный API-интерфейс среды выполнения. Программа MDbg.exe может использоваться только для отладки управляемого кода, отладка неуправляемого кода не поддерживается.
Это средство можно получить с помощью NuGet. Сведения по установке см. в разделе MDbg 0.1.0. Для запуска средства используйте консоль диспетчера пакетов. Дополнительные сведения см. в статье об использовании консоли диспетчера пакетов.
В командной строке диспетчера пакетов введите следующее:
Синтаксис
MDbg [ProgramName[arguments]] [options]
Команды
Когда вы находитесь в отладчике (как указано в командной строке mdbg> ), введите одну из команд, описанных в следующем разделе:
команда [аргументы]
Команды MDbg.exe вводятся с учетом регистра.
Команда | Description |
---|---|
ap[rocess] [number] | Переключается на другой отлаживаемый процесс или распечатывает доступные процессы. Числа являются не реальными идентификаторами процесса (PID), а номерами в списке с индексом, начинающимся с нуля. |
a[ttach] [pid] | Присоединяется к процессу или распечатывает доступные процессы. |
b[reak] [ClassName.Method | FileName:LineNo] | Устанавливает точку останова в указанном методе. Модули сканируются последовательно. - break FileName:LineNo устанавливает точку останова в требуемом месте в источнике. - break ~number устанавливает точку останова на символе, ранее отображенном с помощью команды x. - break module!ClassName.Method+IlOffset устанавливает точку останова в полностью определенном месте. |
block[ingObjects] | Отображает блокировки монитора, которые блокируют потоки. |
ca[tch] [exceptionType] | Вызывает останов отладчика при любых исключениях, а не только в случае необработанных исключений. |
cl[earException] | Отмечает текущее исключение как обработанное, чтобы можно было продолжить выполнение. Если не устранить причину исключения, оно может возникнуть повторно. |
conf[ig] [option value] | Отображает все настраиваемые параметры и способ вызова параметров без необязательных значений. Если параметр указан, задает value как текущий параметр. В настоящее время доступны следующие параметры.- extpath задает путь, по которому выполняется поиск расширений при использовании команды load .- extpath+ добавляет путь для загрузки расширений. |
del[ete] | Удаляет точку останова. |
de[tach] | Отсоединяется от отлаживаемого процесса. |
d[own] [frames] | Перемещает активный кадр стека вниз. |
echo | Выводит сообщение на консоль. |
enableNotif[ication] typeName 0|1 | Включает (1) или отключает (0) пользовательские уведомления для указанного типа. |
ex[it] [код_завершения] | Выполняет выход из оболочки MDbg.exe и при необходимости указывает код завершения процесса. |
fo[reach] [OtherCommand] | Выполняет команду во всех потоках. OtherCommand — это допустимая команда, работающая в одном потоке; foreach OtherCommand выполняет эту же команду во всех потоках. |
f[unceval] [-ad Num] functionName [args ... ] |
Выполняет вычисление функции в текущем активном потоке, где вычисляемая функция — functionName. Имя функции должно быть полным, включая пространства имен. Параметр -ad определяет домен приложения, который должен использоваться для разрешения функции. Если параметр -ad не указан, домен приложения для разрешения по умолчанию устанавливается в домен приложения, в котором расположен поток, используемый для вычисления функции.Если вычисляемая функция не статическая, первый передаваемый параметр должен быть указателем this . Поиск аргументов для вычисления функции выполняется во всех доменах приложения.Чтобы запросить значение из домена приложения, установите префикс переменной с модулем и именем домена приложения; например, funceval -ad 0 System.Object.ToString hello.exe#0!MyClass.g_rootRef . При выполнении этой команды вычисляется функция System.Object.ToString в домене приложения 0 . Поскольку метод ToString является функцией экземпляра, первым параметром должен быть указатель this . |
g[o] | Программа продолжается, пока не будет обнаружена точка останова, не произойдет выход из программы, или какое-либо событие (например, необработанное исключение) не приведет к останову программы. |
h[elp] [command] –или– ? [command] |
Отображает описание всех команд или подробное описание указанной команды. |
ig[nore] [event] | Вызывает останов отладчика только при обнаружении необработанных исключений. |
int[ercept] FrameNumber | Возвращает отладчик к указанному номеру кадра. Если отладчик обнаруживает исключение, с помощью этой команды можно вернуть отладчик к указанному номеру кадра. Можно изменить состояние программы с помощью команды set и продолжить выполнение с помощью команды go. |
k[ill] | Останавливает активный процесс. |
l[ist] [модули | сборок appdomains] | | Отображает загруженные модули, домены приложений или сборки. |
lo[ad] assemblyName | Загружает расширение следующим образом: загружается указанная сборка и выполняется попытка запустить статический метод LoadExtension из типа Microsoft.Tools.Mdbg.Extension.Extension . |
log [eventType] | Задает или отображает события, которые вносятся в журнал. |
mo[de] [option on/off] | Задает различные параметры отладчика. Используйте команду mode без параметров, чтобы получить список режимов отладки и их текущих параметров. |
mon[itorInfo] monitorReference | Отображает сведения о блокировке монитора объекта. |
newo[bj] typeName [arguments...] | Создает объект типа typeName. |
n[ext] | Запускает код и переходит к следующей строке (даже если следующая строка содержит несколько вызовов функций). |
Opendump pathToDumpFile | Открывает указанный файл дампа для отладки. |
o[ut] | Перемещается в конец текущей функции. |
pa[th] [pathName] | Выполняет поиск указанного пути для исходных файлов, если расположение в двоичных файлах недоступно. |
p[rint] [var] | [-d ] |
Распечатывает все переменные в области (print), распечатывает определенную переменную (print var) либо распечатывает переменные отладчика (print-d ). |
printe[xception] [-r] | Распечатывает последнее исключение в текущем потоке. Используйте параметр –r (рекурсивного) для просмотра свойства InnerException в объекте исключения, чтобы получить сведения обо всей цепочке исключений. |
pro[cessenum] | Отображает активные процессы. |
q[uit] [exitcode] | Выходит из оболочки MDbg.exe, по выбору указывая код завершения процесса. |
re[sume] [* | [~ ]threadNumber] |
Возобновляет текущий поток или поток, указанный параметром threadNumber. Если параметр threadNumber указан как * или если номер потока начинается с ~ команда относится ко всем потокам, кроме потока, указанного параметром threadNumber.Возобновление неприостановленного потока не имеет никакого результата. |
r[un] [-d () | -(ptimize ebug ) |-enc o ] [[path_to_exe] [args_to_exe]] |
Останавливает текущий процесс (если есть) и начинает новый процесс. Если не передан аргумент исполняемого файла, эта команда запускает программу, которая ранее запускалась командой run . Если аргумент исполняемого файла передан, указанная программа будет запущена с указанными дополнительными аргументами.Если события загрузки классов и модулей и запуска потоков игнорируются (как это делается по умолчанию), программа будет остановлена на первой исполняемой инструкции основного потока. Можно принудительно установить отладчик в режим JIT-компиляции кода с помощью любого из трех флагов. - -d ( ebug ) отключает оптимизацию. Это значение по умолчанию для MDbg.exe.- -o ( ptimize ) принудительно включает режим работы кода, более похожий на работу вне отладчика, но несколько осложняющий отладку. Это вариант по умолчанию для использования вне отладчика.- -enc активирует функцию "Изменить и продолжить", но снижает производительность. |
Set variable=value | Изменяет значение любой переменной в области. Также можно создать собственные переменные отладчика и присвоить им значения ссылки из самого приложения. Эти значения действуют как дескрипторы для исходного значения, даже если исходное значение находится вне области. Все переменные отладчика должны начинаться с $ (например, $var ). Очистите эти дескрипторы, не задавая для них значение с помощью следующей команды.set $var= |
Setip [-il ] number |
Ставит указатель текущей инструкции (IP) в файле на указанную позицию. Если указать -il этот параметр, число представляет смещение общего промежуточного языка (CIL) в методе. В противном случае число представляет номер строки источника. |
sh[ow] [lines] | Задает число отображаемых строк. |
s[tep] | Переносит выполнение в следующую функцию в текущей строке либо переходит в следующую строку, если нет функции для перехода. |
su[spend] [* | [~]threadNumber] | Приостанавливает выполнение текущего потока или потока, заданного параметром threadNumber. Если значение threadNumber задано как * , команда относится ко всем потокам. Если номер потока начинается с ~ , команда относится ко всем потокам, кроме потока, указанного параметром threadNumber. Приостановленные потоки исключаются из выполнения при запуске процесса командой go или step. Если в процессе нет неприостановленных потоков и выполняется команда go, процесс не будет продолжен. В этом случае нажмите сочетание клавиш CTRL+C, чтобы войти в процесс. |
sy[mbol] commandName [commandValue] | Задает одну из следующих команд. - symbol path ["value" ] — отображает или задает текущий путь к символам.- symbol addpath "value" — добавляется к текущему пути к символам.- symbol reload ["module" ] — перезагружает либо все символы, либо символы для указанного модуля.- symbol list [module ] — отображает текущие загруженные символы либо для всех модулей, либо для указанного модуля. |
t[hread] [newThread] [-nick nickname] |
При выполнении команды потока без параметров отображаются все управляемые потоки текущего процесса. Потоки обычно обозначаются номерами потоков. Однако если потоку присвоен псевдоним, вместо номера отображается псевдоним. Потоку присваивается псевдоним с помощью параметра -nick .- thread -nick threadName присваивает псевдоним выполняемому в настоящее время потоку.Псевдонимы не могут быть числами. Если в текущем потоке уже есть назначенный псевдоним, старый псевдоним заменяется на новый. Если новый псевдоним — пустая строка (""), псевдоним текущего потока удаляется и потоку назначается новый псевдоним. |
u[p] | Перемещает активный кадр стека вверх. |
uwgc[handle] [var] | [адрес] | Распечатывает переменную, отслеживаемую дескриптором. Для указания дескриптора можно использовать имя или адрес. |
when | Отображает активные в данный момент операторы when .при удалении всех num | [num ...num ]] — удаляет инструкцию when , указанную номером, или все when инструкции, если all задано.when stopReason [specific_condition ] docmd [cmd [cmd ...] ] — параметр stopReason может быть одним из следующих:StepComplete , ProcessExited , ThreadCreated BreakpointHit ModuleLoaded ClassLoaded AssemblyLoaded AssemblyUnloaded ControlCTrapped ExceptionThrown UnhandledExceptionThrown AsyncStop AttachComplete UserBreak EvalComplete EvalException RemapOpportunityReached NativeStop Параметр specific_condition может иметь одно из следующих значений. - number — инициирует действие для ThreadCreated и BreakpointHit только при остановке по идентификатору потока или номеру точки останова с тем же значением.[ ! ]name — инициирует действие для ModuleLoaded , ClassLoaded , AssemblyLoaded , AssemblyUnloaded , ExceptionThrown и UnhandledExceptionThrown , только если имя соответствует имени stopReason.Параметр specific_condition должен быть пустым для других значений stopReason. |
w[here] [-v ] [-c depth] [threadID] |
Отображает отладочную информацию о кадрах стека. Параметр -v предоставляет подробную информацию о каждом отображаемом кадре стека.Числовое значение для depth ограничивает количество отображаемых кадров. С помощью команды all можно вывести все кадры. Значение по умолчанию равно 100.Если указать параметр threadID, можно определить, какой поток связан со стеком. Значение по умолчанию — только текущий поток. С помощью команды all можно получить все потоки. |
x [-c numSymbols] [module[! pattern]] |
Отображает функции, соответствующие параметру pattern для модуля.Если указан параметр numSymbols, выводится только указанный номер. Если для pattern не указано значение ! (обозначающее регулярное выражение), отображаются все функции. Если значение для module не указано, отображаются все загруженные модули. Символы (~#) могут использоваться для установки точек останова с помощью команды break. |
Замечания
Скомпилируйте приложение для отладки, используя относящиеся к компилятору флаги, с помощью которых компилятор создаст символы отладки. Дополнительные сведения об этих флагах см. в документации по компилятору. Отладка оптимизированных приложений возможна, но часть отладочной информации будет недоступна. Например, многие локальные переменные будут недоступны, а строки исходного кода будут неточны.
После компиляции приложения введите в командной строке команду mdbg, чтобы начать сеанс отладчика (см. следующий пример).
C:\Program Files\Microsoft Visual Studio 8\VC>mdbg
MDbg (Managed debugger) v2.0.50727.42 (RTM.050727-4200) started.
Copyright (C) Microsoft Corporation. All rights reserved.
For information about commands type "help";
to exit program type "quit".
mdbg>
Сообщение mdbg>
означает, что идет работа с отладчиком.
После входа в отладчик используйте команды и аргументы, описанные в предыдущем разделе.