비고
이 문서는 .NET Framework에만 적용됩니다. .NET 6 이상 버전을 포함하여 .NET의 최신 구현에는 적용되지 않습니다.
MDA(관리되는 디버깅 도우미)는 CLR(공용 언어 런타임)과 함께 작동하여 런타임 상태에 대한 정보를 제공하는 디버깅 보조 기능입니다. 도우미는 그렇지 않으면 트래핑할 수 없는 런타임 이벤트에 대한 정보 메시지를 생성합니다. MDA를 사용하여 관리 코드와 관리되지 않는 코드 간에 전환할 때 발생하는 찾기 어려운 애플리케이션 버그를 격리할 수 있습니다.
Windows 레지스트리에 키를 추가하거나 환경 변수를 설정하여 모든 MDA를 사용하거나 사용하지 않도록 설정할 수 있습니다. 애플리케이션 구성 설정을 사용하여 특정 MDA를 사용하도록 설정할 수 있습니다. 애플리케이션의 구성 파일에서 일부 개별 MDA에 대한 추가 구성 설정을 설정할 수 있습니다. 이러한 구성 파일은 런타임이 로드될 때 구문 분석되므로 관리되는 애플리케이션이 시작되기 전에 MDA를 사용하도록 설정해야 합니다. 이미 시작된 애플리케이션에는 사용하도록 설정할 수 없습니다.
다음 표에서는 .NET Framework와 함께 제공되는 MDA를 나열합니다.
기본적으로 .NET Framework는 모든 관리되는 디버거에 대해 MDA의 하위 집합을 활성화합니다. 디버그 메뉴에서 >예외 설정을 선택한 다음 관리되는 디버깅 도우미 목록을 확장하여 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;gcUnmanagedToManaged
는gcUnmanagedToManaged
을 활성화하지만, 디버거에서 암시적으로 활성화될 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는 Marshaling
methodFilter 및 fieldFilter 자식 요소에 제공된 메서드 및 구조 필드의 이름을 각각 필터링할 수 있습니다.
다음 예제에서는 기본 설정을 사용하여 여러 MDA를 사용하도록 설정하는 방법을 보여 줍니다.
<mdaConfig>
<assistants>
<illegalPrepareConstrainedRegion />
<invalidCERCall />
<openGenericCERCall />
<virtualCERCall />
</assistants>
</mdaConfig>
중요합니다
구성 파일에서 둘 이상의 도우미를 지정하는 경우 사전순으로 나열해야 합니다. 예를 들어, virtualCERCall
및 invalidCERCall
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 서명의 호출 규칙 및 매개 변수가 관리되지 않는 대상 서명과 일치하는지 확인합니다.
참고하십시오
.NET