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


Диагностика ошибок посредством управляемых помощников по отладке

Управляемые помощники по отладке (MDA) — средства отладки, взаимодействующие со средой CLR и предоставляющие информацию о ее состоянии. Помощники генерируют информационные сообщения о событиях времени выполнения, которые иначе невозможно обнаружить. Можно использовать MDA, чтобы изолировать трудные для обнаружения ошибки, которые происходят при переходах между управляемым и неуправляемым кодом. Можно включить или отключить все MDA посредством добавления ключа в реестр Windows или настройки переменной среды. Можно включить отдельные MDA с помощью настроек конфигурации приложения. Можно задать дополнительные настройки конфигурации для некоторых отдельных MDA в файле конфигурации приложения. Поскольку данные файлы конфигурации анализируются во время загрузки среды выполнения, необходимо включить MDA до запуска управляемого приложения. Нельзя включить MDA для приложений, которые уже запущены.

ПримечаниеПримечание

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

ПримечаниеПримечание

При выполнении кода в интегрированной среде разработки Visual Studio можно избежать появления диалогового окна с сообщением об исключении для отдельных событий MDA.Для этого в меню Отладка выберите пункт Исключения.(Если в меню Отладка нет пункта Исключения, в меню Сервис выберите команду Настроить, чтобы добавить его.) В диалоговом окне Исключения раскройте список Помощники отладки управляемого кода и снимите флажок Вызванное для конкретного помощника MDA.Например, чтобы отключить появление диалогового окна для contextSwitchDeadlock MDA, снимите флажок Вызванное для соответствующего имени в списке Помощники отладки управляемого кода.Данное диалоговое окно можно также использовать для включения помощников MDA.

В следующей таблице перечислены MDA, включенные в .NET Framework:

Помощник по отладке управляемого кода asynchronousThreadAbort

bindingFailure MDA

callbackOnCollectedDelegate MDA

contextSwitchDeadlock MDA

dangerousThreadingAPI MDA

dateTimeInvalidLocalFormat MDA

Помощник по отладке управляемого кода dirtyCastAndCallOnInterface

disconnectedContext MDA

Помощник по отладке управляемого кода dllMainReturnsFalse

exceptionSwallowedOnCallFromCom MDA

Помощник по отладке управляемого кода failedQI

Помощник по отладке управляемого кода fatalExecutionEngineError

gcManagedToUnmanaged MDA

gcUnmanagedToManaged MDA

illegalPrepareConstrainedRegion MDA

Помощник по отладке управляемого кода invalidApartmentStateChange

Помощник по отладке управляемого кода invalidCERCall

invalidFunctionPointerInDelegate MDA

invalidGCHandleCookie MDA

Помощник по отладке управляемого кода invalidIUnknown

Помощник по отладке управляемого кода invalidMemberDeclaration

invalidOverlappedToPinvoke MDA

Помощник по отладке управляемого кода invalidVariant

jitCompilationStart MDA

Помощник по отладке управляемого кода loaderLock

Помощник по отладке управляемого кода loadFromContext

marshalCleanupError MDA

MDA маршалинг

memberInfoCacheCreation MDA

moduloObjectHashcode MDA

nonComVisibleBaseClass MDA

notMarshalable MDA

openGenericCERCall MDA

Помощник по отладке управляемого кода overlappedFreeError

Помощник по отладке управляемого кода pInvokeLog

pInvokeStackImbalance MDA

Помощник по отладке управляемого кода raceOnRCWCleanup

MDA с возможностью повторного входа

releaseHandleFailed MDA

Помощник по отладке управляемого кода reportAvOnComRelease

streamWriterBufferedDataLost MDA

virtualCERCall MDA

По умолчанию платформа .NET Framework активирует подмножество MDA для всех управляемых отладчиков. В Visual Studio можно просмотреть набор по умолчанию, нажав на кнопку Исключения в меню Отладка и развернув список Управляемые помощники по отладке.

Включение и отключение MDA

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

В Visual Studio 2005 и более поздних версиях при включении процесса размещения невозможно отключить MDA, содержащиеся в наборе по умолчанию, либо включить MDA, которые не входят в набор по умолчанию. Процесс размещения включается по умолчанию, поэтому его нужно отключить явным образом.

Чтобы отключить процесс размещения в Visual Studio, необходимо выполнить следующие действия:

  1. Выберите проект в Обозревателе решений.

  2. В меню Проект выберите Свойства.

    Появится окно Конструктора проектов.

  3. Откройте вкладку Отладка.

  4. В разделе Включить отладчики снимите флажок Разрешить процесс размещения Visual Studio.

Однако отключение процесса размещения может повлиять на производительность. Можно избежать необходимости отключать MDA, запретив Visual Studio отображение диалогового окна MDA при получении уведомлений MDA. Для этого следует нажать кнопку Исключения в меню Отладка и развернуть список Управляемые помощники по отладке, после чего установить или снять флажок Вызов для конкретного MDA.

Включение и отключение MDA посредством ключа реестра

MDA можно включить, создав в реестре Windows подраздел HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\Policy\MDA (тип "REG_SZ", значение "1"). Чтобы включить MDA, приведенный ниже пример кода следует перенести в текстовый файл с именем MDAEnable.reg, а затем дважды щелкнуть этот файл в проводнике:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"

Чтобы отключить MDA, пользуясь редактором реестра, значение подраздела MDA следует изменить на "0" (нуль). Кроме того, можно также перенести приведенный ниже пример кода в текстовый файл с именем MDADisable.reg, а затем дважды щелкнуть этот файл в проводнике:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="0"

При запуске приложения, присоединенного к отладчику, некоторые MDA включаются по умолчанию, даже несмотря на то, что ключ реестра при этом не используется. Примерами таких помощников являются pInvokeStackImbalance MDA и Помощник по отладке управляемого кода invalidApartmentStateChange. Такие помощники можно отключить, запустив файл MDADisable.reg так, как было описано выше.

Включение и отключение MDA с помощью переменной среды

Использованием MDA позволяет управлять также переменная среды COMPLUS_MDA, которая переопределяет значение раздела реестра. Строка COMPLUS_MDA представляет собой нечувствительный к регистру список имен MDA, разделенных точкой с запятой, а также иных специальных управляющих строк. Запуск в режиме управляемого или неуправляемого отладчика включает набор MDA по умолчанию. Для этого достаточно неявным образом добавить в начало значения переменной среды или ключа реестра список включаемых в режиме отладчика по умолчанию MDA, разделенных точкой с запятой. К специальным строкам управления относятся следующие:

  • 0 — деактивирует все MDA;

  • 1 — считывает настройки MDA из Имя_приложения.mda.config;

  • managedDebugger — явным образом активирует все MDA, которые активированы неявным образом при запуске управляемого исполняемого приложения в режиме отладчика;

  • unmanagedDebugger — явным образом активирует все MDA, которые активированы неявным образом при запуске неуправляемого исполняемого приложения в режиме отладчика.

При наличии конфликта настроек последние настройки переопределяют предыдущие:

  • COMPLUS_MDA=0 отключает все MDA, в том числе и те, которые оказались неявным образом включены при отладке;

  • COMPLUS_MDA=gcUnmanagedToManaged включает gcUnmanagedToManaged дополнительно к тем MDA, которые были неявным образом включены при отладке;

  • COMPLUS_MDA=0;gcUnmanagedToManaged включает gcUnmanagedToManaged, но отключает все MDA, которые могут быть неявно включены при отладке.

Включение и отключение MDA с помощью конфигурационных параметров приложения

Можно отдельно включать, отключать и настраивать некоторые помощники в файле конфигурации MDA для приложения. Чтобы включить функцию использования файла конфигурации приложения для настройки MDA, необходимо установить либо ключ реестра MDA, либо переменную среды COMPLUS_MDA. Файл конфигурации приложения обычно находится в том же каталоге, что исполняемый файл приложения (EXE-файл). Имя файла имеет форму Имя_приложения.mda.config; например, notepad.exe.mda.config. Помощники, которые запускаются посредством файла конфигурации приложения, могут иметь атрибуты или элементы, специально созданные для управления поведением такого помощника. В следующем примере показано, как включить и настроить MDA маршалинг:

<mdaConfig>
  <assistants>
    <marshaling>
      <methodFilter>
        <match name="*"/>
      </methodFilter>
      <fieldFilter>
        <match name="*"/>
      </fieldFilter>
    </marshaling>
  </assistants>
</mdaConfig>

Marshaling MDA при каждом переходе в приложении от управляемого к неуправляемому сообщает данные об управляемом типе, для которого производится маршалинг в неуправляемый. Marshaling MDA позволяет также осуществлять фильтрацию по имени метода и структурным полям дочерних элементов — соответственно <methodFilter> и <fieldFilter>.

В следующем примере показано, как при помощи значений по умолчанию можно запустить несколько MDA.

<mdaConfig>
  <assistants>
    <illegalPrepareConstrainedRegion />
    <invalidCERCall />
    <openGenericCERCall />
    <virtualCERCall />
  </assistants>
</mdaConfig>
Важное примечаниеВажно

Если в файле конфигурации нужно указать более одного помощника, их следует перечислить в алфавитном порядке.Например, если требуется запустить два MDA — virtualCERCall и invalidCERCall, значение <virtualCERCall /> должно следовать после значения <invalidCERCall />.В случае нарушения алфавитного порядка этих параметров будет выведено сообщение об исключении, вызванном ошибкой в файле конфигурации.

Результат работы MDA

Результат работы MDA сходен со следующим примером, который демонстрирует результат работы MDA pInvokeStackImbalance:

A call to PInvoke function 'MDATest!MDATest.Program::StdCall' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

См. также

Другие ресурсы

Отладка, трассировка и профилирование