관리 디버깅 도우미를 사용하여 오류 진단

MDA(관리 디버깅 도우미)는 런타임 상태에 대한 정보를 제공하기 위해 CLR(공용 언어 런타임)과 작동하는 디버깅 도우미입니다. 이 도우미는 다른 방법으로는 트래핑할 수 없는 런타임 이벤트에 대한 정보 메시지를 생성합니다. MDA를 사용하면 관리 코드와 비관리 코드 간에 변환할 때 발생하는 찾기 어려운 애플리케이션 버그를 구분할 수 있습니다.

Windows 레지스트리에 키를 추가하거나 환경 변수를 설정하여 모든 MDA를 사용하거나 사용하지 않도록 설정할 수 있습니다. 애플리케이션 구성 설정을 사용하여 특정 MDA를 사용하도록 설정할 수 있습니다. 애플리케이션의 구성 파일에서 일부 개별 MDA에 대한 추가 구성 설정을 지정할 수 있습니다. 이러한 구성 파일은 런타임이 로드될 때 구문 분석되므로 관리되는 애플리케이션이 시작되기 전에 MDA를 사용하도록 설정해야 합니다. 이미 시작된 애플리케이션에 대해서는 MDA를 사용하도록 설정할 수 없습니다.

다음 표에서는 .NET Framework와 함께 제공되는 MDA를 나열합니다.

MDA
asynchronousThreadAbort
bindingFailure
callbackOnCollectedDelegate
contextSwitchDeadlock
dangerousThreadingAPI
dateTimeInvalidLocalFormat
dirtyCastAndCallOnInterface
disconnectedContext
dllMainReturnsFalse
exceptionSwallowedOnCallFromCom
failedQI
fatalExecutionEngineError
gcManagedToUnmanaged
gcUnmanagedToManaged
illegalPrepareConstrainedRegion
invalidApartmentStateChange
invalidCERCall
invalidFunctionPointerInDelegate
invalidGCHandleCookie
invalidIUnknown
invalidMemberDeclaration
invalidOverlappedToPinvoke
invalidVariant
jitCompilationStart
loaderLock
loadFromContext
marshalCleanupError
marshaling
memberInfoCacheCreation
moduloObjectHashcode
nonComVisibleBaseClass
notMarshalable
openGenericCERCall
overlappedFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
reentrancy
releaseHandleFailed
reportAvOnComRelease
streamWriterBufferedDataLost
virtualCERCall

기본적으로 .NET Framework는 모든 관리되는 디버거에 대한 MDA의 하위 집합을 활성화합니다. 디버그 메뉴에서 Windows>예외 설정을 선택하고 관리 디버깅 도우미 목록을 확장하여 Visual Studio의 기본 집합을 볼 수 있습니다.

Exception Settings window in Visual Studio

MDA를 사용 및 사용하지 않도록 설정

레지스트리 키, 환경 변수 및 애플리케이션 구성 설정을 사용하여 MDA를 사용하거나 사용하지 않도록 설정할 수 있습니다. 애플리케이션 구성 설정을 사용하려면 레지스트리 키 또는 환경 변수를 사용하도록 설정해야 합니다.

MDA를 사용하지 않도록 설정하는 대신 MDA 알림을 받을 때마다 Visual Studio에서 MDA 대화 상자를 표시하지 못하도록 할 수 있습니다. 이렇게 하려면 디버그 메뉴에서 Windows>예외 설정을 클릭하고 관리 디버깅 도우미 목록을 확장한 다음 개별 MDA의 발생된 경우 중단 확인란을 선택하거나 선택 취소합니다.

레지스트리 키

MDA를 사용하도록 설정하려면 Windows 레지스트리에서 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\MDA 하위 키(종류 REG_SZ, 값 1)를 추가합니다. 다음 예제를 MDAEnable.reg라는 텍스트 파일에 복사합니다. Windows 레지스트리 편집기(RegEdit.exe)를 열고 파일 메뉴에서 가져오기를 선택합니다. MDAEnable.reg 파일을 선택하여 해당 컴퓨터에서 MDA를 사용하도록 설정합니다. 하위 키를 문자열 값 1(DWORD 값 1 아님)로 설정하면 ApplicationName.suffix.mda.config 파일에서 MDA 설정 읽기가 사용하도록 설정됩니다. 예를 들어, 메모장의 MDA 구성 파일은 이름이 notepad.exe.mda.config로 지정됩니다.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"

컴퓨터가 64비트 운영 체제에서 32비트 애플리케이션을 실행 중인 경우 MDA 키는 다음과 같이 설정됩니다.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework]
"MDA"="1"

자세한 내용은 애플리케이션별 구성 설정을 참조하세요. 레지스트리 설정은 COMPLUS_MDA 환경 변수로 재정의할 수 있습니다. 자세한 내용은 환경 변수를 참조하세요.

MDA를 사용하지 않도록 설정하려면 Windows 레지스트리 편집기를 사용하여 MDA 하위 키를 0으로 설정합니다.

기본적으로 일부 MDA는 디버거에 연결된 애플리케이션을 실행하면 레지스트리 키를 추가하지 않더라도 사용하도록 설정됩니다. 이 섹션의 앞부분에 설명되어 있는 것처럼 MDADisable.reg 파일을 실행하여 이러한 도우미를 사용하지 않도록 설정할 수 있습니다.

환경 변수

MDA 활성화는 레지스트리 키를 재정의하는 환경 변수 COMPLUS_MDA에 의해서도 제어됩니다. COMPLUS_MDA 문자열은 대/소문자를 구분하지 않으며, 세미콜론으로 구분된 MDA 이름 또는 기타 특수 제어 문자열의 목록입니다. 관리되는 디버거 또는 관리되지 않는 디버거에서 시작하면 기본적으로 MDA 집합이 사용하도록 설정됩니다. 이러한 설정은 디버거에서 기본적으로 사용하도록 설정된, 세미콜론으로 구분된 MDA 목록을 환경 변수 또는 레지스트리 키 값에 추가하여 암시적으로 수행됩니다. 특수 제어 문자열은 다음과 같습니다.

  • 0 - 모든 MDA를 비활성화합니다.

  • 1 - ApplicationName.mda.config에서 MDA 설정을 읽습니다.

  • managedDebugger - 관리되는 실행 파일이 디버거에서 시작되면 암시적으로 활성화되는 모든 MDA를 명시적으로 활성화합니다.

  • unmanagedDebugger - 관리되지 않는 실행 파일이 디버거에서 시작되면 암시적으로 활성화되는 모든 MDA를 명시적으로 활성화합니다.

충돌하는 설정이 있는 경우 최신 설정이 이전 설정을 재정의합니다.

  • COMPLUS_MDA=0은 디버거에서 암시적으로 사용하도록 설정된 MDA를 포함하여 모든 MDA를 사용하지 않도록 설정합니다.

  • COMPLUS_MDA=gcUnmanagedToManaged는 디버거에서 암시적으로 사용하도록 설정된 모든 MDA 외에 gcUnmanagedToManaged를 사용하도록 설정합니다.

  • COMPLUS_MDA=0;gcUnmanagedToManagedgcUnmanagedToManaged를 사용하도록 설정하지만 디버거에서 달리 암시적으로 사용하도록 설정되지 않는 MDA를 사용하지 않도록 설정합니다.

애플리케이션별 구성 설정

애플리케이션의 MDA 구성 파일에서 일부 도우미를 개별적으로 사용하도록 설정, 사용하지 않도록 설정 및 구성할 수 있습니다. MDA를 구성하는 데 애플리케이션 구성 파일을 사용할 수 있으려면 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>

Marshaling MDA는 애플리케이션에서 각 관리되는-관리되지 않는 변환의 관리되지 않는 형식으로 마샬링되는 관리되는 형식에 대한 정보를 내보냅니다. 또한 Marshaling MDA는 각각 methodFilterfieldFilter 자식 요소에 제공된 메서드 및 구조 필드의 이름을 필터링할 수 있습니다.

다음 예제에서는 해당 기본 설정을 사용하여 여러 MDA를 사용하도록 설정하는 방법을 보여 줍니다.

<mdaConfig>
  <assistants>
    <illegalPrepareConstrainedRegion />
    <invalidCERCall />
    <openGenericCERCall />
    <virtualCERCall />
  </assistants>
</mdaConfig>

Important

구성 파일에 둘 이상의 도우미를 지정할 때는 사전순으로 나열해야 합니다. 예를 들어, virtualCERCall MDA와 invalidCERCall MDA를 둘 다 사용하도록 설정하려면 <invalidCERCall /> 항목 앞에 <virtualCERCall /> 항목을 추가해야 합니다. 항목이 사전순이 아니면 처리되지 않은 잘못된 구성 파일 예외 메시지가 표시됩니다.

MDA 예외

MDA가 사용하도록 설정되면 코드가 디버거에서 실행되지 않을 때도 MDA가 활성 상태입니다. 디버거가 없을 때 MDA 이벤트가 발생하면 이벤트 메시지가 처리되지 않은 예외가 아니더라도 처리되지 않은 예외 대화 상자에 표시됩니다. 이 대화 상자가 표시되지 않도록 하려면 코드가 디버깅 환경에서 실행되지 않는 경우 MDA 사용 설정을 제거하세요.

코드가 Visual Studio IDE(통합 개발 환경)에서 실행되는 경우 특정 MDA 이벤트에 대해 나타나는 예외 대화 상자가 표시되지 않도록 할 수 있습니다. 이렇게 하려면 디버그 메뉴에서 Windows>예외 설정을 선택합니다. 예외 설정 창에서 관리 디버깅 도우미 목록을 확장한 다음 개별 MDA의 발생된 경우 중단 확인란을 선택 취소합니다. 또한 이 대화 상자를 사용하여 MDA 예외 대화 상자가 표시되도록 활성화할 수 있습니다.

MDA 출력

MDA 출력은 PInvokeStackImbalance MDA의 출력을 보여 주는 다음 예제와 유사합니다.

PInvoke 함수 'MDATest! MDATest.Program::StdCall'을 호출하여 스택의 균형을 해제했습니다. 관리되는 PInvoke 서명이 관리되지 않는 대상 서명과 일치하지 않기 때문일 수 있습니다. PInvoke 서명의 호출 규칙 및 매개 변수가 관리되지 않는 대상 서명과 일치하는지 확인합니다.

참고 항목