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


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

Обновлен: Июль 2008

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

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

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

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

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

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

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

bindingFailure MDA

callbackOnCollectedDelegate MDA

contextSwitchDeadlock MDA

dangerousThreadingAPI MDA

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

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

disconnectedContext MDA

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

exceptionSwallowedOnCallFromCom MDA

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

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

gcManagedToUnmanaged MDA

gcUnmanagedToManaged MDA

illegalPrepareConstrainedRegion MDA

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

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

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

invalidGCHandleCookie MDA

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

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

invalidOverlappedToPinvoke MDA

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

jitCompilationStart MDA

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

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

marshalCleanupError MDA

MDA маршалинг

memberInfoCacheCreation MDA

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

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

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

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

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

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

pInvokeStackImbalance MDA

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

reentrancy 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, добавив подраздел HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\Policy\MDA в реестр Windows. Необходимо скопировать следующий пример в текстовый файл с именем "MDAEnable.reg":

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

Из командной строки нужно выполнить файл MDAEnable.reg, чтобы включить MDA на компьютере. Чтобы отключить MDA, необходимо скопировать следующий пример в текстовый файл с именем "MDADisable.reg":

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

Затем нужно выполнить файл MDADisable.reg из командной строки.

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

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

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

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

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

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

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

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

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

  • COMPLUS_MDA=gcUnmanagedToManaged включает gcUnmanagedToManaged вместе с любыми неявным образом включенными в режиме отладчика;

  • COMPLUS_MDA =0;gcUnmanagedToManaged включает gcUnmanagedToManaged, но отключает те 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>

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

Дополнительные сведения о настройках, характерных для каждого отдельного MDA, см. в документации для данного MDA.

Результат работы 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.

См. также

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

Отладка и профилирование приложений

Журнал изменений

Дата

Журнал

Причина

Июль 2008

Добавлено примечание о том, как избежать появления сообщения ContextSwitchDeadlock.

Обратная связь от клиента.