Диагностика ошибок с помощью помощников по управляемой отладке
Примечание.
Эта статья относится к .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.
Помощники по управляемой отладке (MDAs) — это средства отладки, которые работают с средой CLR для предоставления сведений о состоянии среды выполнения. Эти помощники формируют информационные сообщения о событиях времени выполнения, которые вы не можете зафиксировать иными средствами. Вы можете использовать помощники отладки управляемого кода для изоляции тяжело обнаружимых ошибок приложения, возникающих при переходе между управляемым и неуправляемым кодом.
Вы можете включить или отключить все mdAs, добавив ключ в реестр Windows или установив переменную среды. Вы можете включить отдельные помощники, используя параметры конфигурации приложения. Вы можете задать дополнительные параметры для некоторых отдельных помощников в файле конфигурации приложения. Поскольку эти файлы конфигурации анализируются при загрузке среды выполнения, следует включить помощник до запуска управляемого приложения. Вы не сможете включить его для уже запущенных приложений.
В следующей таблице перечислены mdAs, которые поставляется с платформа .NET Framework:
По умолчанию .NET Framework активирует подмножество помощников отладки управляемого кода для всех управляемых отладчиков. Вы можете просмотреть набор по умолчанию в Visual Studio, выбрав параметры исключений Windows>в меню отладки, а затем разверните список "Помощники по управляемой отладке".
Включение и отключение MDAs
Вы можете включать и отключать помощники отладки управляемого кода с помощью раздела реестра, переменной среды и параметров конфигурации приложения. Чтобы воспользоваться параметрами конфигурации приложения, вы должны включить раздел реестра или переменную среды.
Совет
Вместо отключения mdAs можно запретить Visual Studio отображать диалоговое окно MDA при получении уведомления MDA. Для этого выберите параметры исключений Windows>в меню отладки, разверните список помощников по управляемой отладке, а затем установите или снимите флажок "Разрыв при возникновении" для отдельного MDA.
Раздел реестра
Чтобы включить MDAs, добавьте HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\. Подраздел NETFramework\MDA (тип REG_SZ, значение 1) в реестре Windows. Скопируйте следующий пример в текстовый файл с именем MDAEnable.reg. Откройте редактор реестра Windows (RegEdit.exe), а в меню "Файл " выберите "Импорт". Выберите файл MDAEnable.reg, чтобы включить mdAs на этом компьютере. Задание подраздела строковым значением 1 (не значение DWORD 1) позволяет считывать параметры MDA из файла конфигурации ApplicationName.suffix.mda.config. Например, файл конфигурации MDA для Блокнота будет называться notepad.exe.mda.config.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"
Если на компьютере в 64-разрядной операционной системе выполнянется 32-разрядное приложение, раздел помощника нужно задать следующим образом:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework]
"MDA"="1"
Дополнительные сведения см . в разделе "Параметры конфигурации для конкретных приложений". Параметр реестра можно переопределить переменной COMPLUS_MDA
среды. Дополнительные сведения см. в переменной среды.
Чтобы отключить mdAs, установите для подраздела MDA значение 0 (ноль) с помощью редактора реестра Windows.
По умолчанию некоторые помощники отладки управляемого кода включаются при запуске приложения, подключенного к отладчику, даже без добавления раздела реестра. Эти помощники можно отключить, выполнив файл MDADisable.reg , как описано ранее в этом разделе.
Переменная среды
Активация MDA также может контролироваться переменной COMPLUS_MDA
среды, которая переопределяет раздел реестра. Строка COMPLUS_MDA
представляет собой нечувствительный регистр, разделенный точкой с запятой список имен MDA или других специальных строк управления. При запуске под контролем управляемого или неуправляемого отладчика по умолчанию включается набор помощников. Для этого необходимо неявным образом добавить разделенный точками с запятыми список помощников, которые включаются по умолчанию под контролем отладчиков, в начало значения переменной среды или раздела реестра. Специальные управляющие строки:
0
— отключает все помощники.1
— считывает параметры помощника из файла ИмяПриложения.mda.config.managedDebugger
— явным образом активирует все помощники, которые активируются неявно при запуске управляемого исполняемого файла под контролем отладчика.unmanagedDebugger
— явным образом активирует все помощники, которые активируются неявно при запуске неуправляемого исполняемого файла под контролем отладчика.
При наличии конфликтующих параметров более старые параметры переопределяются более новыми:
COMPLUS_MDA=0
отключает все помощники, включая те, которые неявно включаются под контролем отладчика.COMPLUS_MDA=gcUnmanagedToManaged
включаетgcUnmanagedToManaged
в дополнение к помощникам, которые неявно включаются под контролем отладчика.COMPLUS_MDA=0;gcUnmanagedToManaged
включаетgcUnmanagedToManaged
, но отключает те помощники, которые были бы неявно включены под контролем отладчика.
Параметры конфигурации для конкретного приложения
Вы можете включать, отключать и настраивать некоторые помощники по отдельности в файле конфигурации помощников отладки управляемого кода для данного приложения. Чтобы включить использование файла конфигурации приложения для настройки mdAs, необходимо задать раздел реестра MDA или COMPLUS_MDA
переменную среды. Файл конфигурации приложения обычно находится в одном каталоге с исполняемым файлом (EXE) приложения. Имя файла принимает форму ApplicationName.mda.config; например, notepad.exe.mda.config. Помощники, включенные в файл конфигурации приложения, могут иметь атрибуты или элементы, предназначенные для управления поведением помощника.
В следующем примере показано, как включить и настроить маршалинг:
<mdaConfig>
<assistants>
<marshaling>
<methodFilter>
<match name="*"/>
</methodFilter>
<fieldFilter>
<match name="*"/>
</fieldFilter>
</marshaling>
</assistants>
</mdaConfig>
MDA Marshaling
выдает сведения об управляемом типе, который маршалируется в неуправляемый тип для каждого управляемого перехода в неуправляемое приложение. MDA Marshaling
также может фильтровать имена полей метода и структуры, предоставленных в дочерних элементах methodFilter и fieldFilter соответственно.
В следующем примере показано, как включить несколько MDA с помощью параметров по умолчанию:
<mdaConfig>
<assistants>
<illegalPrepareConstrainedRegion />
<invalidCERCall />
<openGenericCERCall />
<virtualCERCall />
</assistants>
</mdaConfig>
Внимание
При указании нескольких помощников в файле конфигурации их следует перечислять в алфавитном порядке. Например, если вы хотите включить помощники virtualCERCall
и invalidCERCall
, необходимо добавить запись <invalidCERCall />
перед записью <virtualCERCall />
. Если записи расположены не в алфавитном порядке, отображается сообщение о необработанном исключении недопустимого файла конфигурации.
Исключения MDA
Если MDA включен, он активен, даже если код не выполняется под отладчиком. Если событие помощника отладки управляемого кода возникает при отсутствии отладчика, сообщений события выводится в диалоговом окне необработанного исключения, хотя оно и не является необработанным исключением. Чтобы предотвратить появление диалогового окна, удаляйте параметр, отвечающий за включение помощника, когда ваш код не выполняется в среде отладки.
При выполнении кода в интегрированной среде разработки Visual Studio можно избежать диалогового окна исключения, которое отображается для определенных событий MDA. Для этого в меню отладки выберите параметры исключений Windows>. В окне "Параметры исключений" разверните список "Помощники по управляемой отладке", а затем снимите флажок "Разрыв при возникновении" для отдельного MDA. Это диалоговое окно также можно использовать для включения отображения диалоговых окон исключений MDA.
Выходные данные помощников
Выходные данные MDA аналогичны следующему примеру, в котором показаны выходные данные PInvokeStackImbalance
MDA:
Вызов функции PInvoke "MDATest! MDATest.Program::StdCall' разбалансировал стек. Скорее всего, это связано с тем, что управляемая подпись PInvoke не соответствует неуправляемой целевой подписи. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи.