다음을 통해 공유


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

비고

이 문서는 .NET Framework에만 적용됩니다. .NET 6 이상 버전을 포함하여 .NET의 최신 구현에는 적용되지 않습니다.

MDA(관리되는 디버깅 도우미)는 CLR(공용 언어 런타임)과 함께 작동하여 런타임 상태에 대한 정보를 제공하는 디버깅 보조 기능입니다. 도우미는 그렇지 않으면 트래핑할 수 없는 런타임 이벤트에 대한 정보 메시지를 생성합니다. MDA를 사용하여 관리 코드와 관리되지 않는 코드 간에 전환할 때 발생하는 찾기 어려운 애플리케이션 버그를 격리할 수 있습니다.

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

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

MDA
비동기 스레드 중단
바인딩 실패
콜백온콜렉티드델리게이트
컨텍스트 전환 교착 상태
dangerousThreadingAPI
날짜시간유효하지않은로컬형식
dirtyCastAndCallOnInterface
끊어진 컨텍스트
dllMainReturnsFalse
Com에서 호출된 예외 처리
실패한품질검사
치명적 실행 엔진 오류
관리 메모리에서 비관리 메모리로
gcUnmanagedToManaged
불법준비제한구역
잘못된 아파트 상태 변경
invalidCERCall
델리게이트에서 잘못된 함수 포인터
유효하지 않은 GC 핸들 쿠키
invalidIUnknown
유효하지 않은 멤버 선언
유효하지 않은 오버랩 핀보크
유효하지 않은 변형
jitCompilationStart
loaderLock
loadFromContext
marshalCleanupError
마샬링
멤버정보캐시생성
moduloObjectHashcode
nonComVisibleBaseClass
notMarshalable
openGenericCERCall
overlappedFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
재진입
핸들 해제 실패
reportAvOnComRelease
스트림라이터버퍼데이터손실
virtualCERCall

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

Visual Studio의 예외 설정 창

MDA 사용 및 사용 안 함

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

팁 (조언)

MDA를 사용하지 않도록 설정하는 대신 MDA 알림을 받을 때마다 Visual Studio에서 MDA 대화 상자를 표시하지 못하도록 할 수 있습니다. 이렇게 하려면 디버그 메뉴에서 >예외 설정을 선택하고 관리되는 디버깅 도우미 목록을 확장한 다음 개별 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"

자세한 내용은 Application-Specific 구성 설정을 참조하세요. 레지스트리 설정은 COMPLUS_MDA 환경 변수에 의해 재정의될 수 있습니다. 자세한 내용은 환경 변수 를 참조하세요.

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

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

환경 변수

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

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

  • 1 - ApplicationName.mda.configMDA 설정을 읽습니다.

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

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

충돌하는 설정이 있는 경우 가장 최근의 설정은 이전 설정을 재정의합니다.

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

  • COMPLUS_MDA=gcUnmanagedToManaged는 디버거에서 암시적으로 활성화되는 모든 MDA에 추가로 gcUnmanagedToManaged도 활성화합니다.

  • COMPLUS_MDA=0;gcUnmanagedToManagedgcUnmanagedToManaged 을 활성화하지만, 디버거에서 암시적으로 활성화될 MDAs는 비활성화합니다.

Application-Specific 구성 설정

애플리케이션에 대한 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>

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

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

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

중요합니다

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

MDA 예외

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

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

MDA 출력

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

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

참고하십시오