다음을 통해 공유


Visual Studio에서 Just-In-Time 디버거를 사용하여 디버그

Just-In-Time 디버깅은 Visual Studio 외부에서 실행 중인 앱에 오류 또는 충돌이 발생하면 Visual Studio를 자동으로 시작할 수 있습니다. Just-In-Time 디버깅을 사용하면 Visual Studio 외부의 앱을 테스트하고, 문제가 발생하는 경우 Visual Studio를 열어 디버깅을 시작할 수 있습니다.

Just-In-Time 디버깅은 Windows 데스크톱 앱에서 작동합니다. 유니버설 Windows 앱 또는 시각화 도우미와 같은 네이티브 애플리케이션에 호스팅된 관리 코드에는 작동하지 않습니다.

Just-In-Time 디버거 대화 상자가 나타나지 않게 하고 Visual Studio가 설치되지 않은 경우 Just-In-Time 디버거 사용 안 함을 참조하세요. Visual Studio를 설치한 후에는 Windows 레지스트리에서 Just-In-Time 디버깅을 사용하지 않도록 설정해야 할 수 있습니다.

Visual Studio에서 Just-In-Time 디버깅 사용 또는 사용 안 함

Visual Studio 도구>옵션(또는 디버그>옵션) 대화 상자에서 Just-In-Time 디버깅을 구성할 수 있습니다.

참고 항목

Just-in-time 디버깅을 사용하거나 사용하지 않도록 설정하려면 관리자 권한으로 Visual Studio를 실행해야 합니다. Just-In-Time 디버깅을 사용하거나 사용하지 않도록 설정하면 레지스트리 키가 설정되며 해당 키를 변경하려면 관리자 권한이 필요할 수 있습니다. Visual Studio를 관리자 권한으로 열려면 Visual Studio 앱을 마우스 오른쪽 단추로 클릭하고 관리자 권한으로 실행을 선택합니다.

Just-In-Time 디버깅을 활성화하거나 비활성화하려면:

  1. 도구 또는 디버그 메뉴에서 옵션>디버깅>Just-In-Time을 선택합니다.

    JIT 디버깅 사용 또는 사용 안 함

    참고

    Just-In-Time 메뉴 옵션이 표시되지 않으면 Visual Studio 설치 관리자를 사용하여 Just-In-Time 디버거가 설치되어 있는지 확인합니다.

  2. 이러한 코드 형식에 Just-In-Time 디버깅 사용 상자에서 Just-In-Time 디버깅이 디버그할 코드 형식을 선택합니다. 관리, 네이티브 및/또는 스크립트.

  3. 확인을 선택합니다.

Just-In-Time 디버거를 사용하도록 설정했지만 앱이 충돌하거나 오류가 발생할 때 열리지 않으면 Just-In-Time 디버깅 문제 해결을 참조하세요.

Windows 레지스트리에서 Just-In-Time 디버깅 비활성화

컴퓨터에 Visual Studio가 더 이상 설치되어 있지 않아도 Just-In-Time 디버깅은 계속 활성화되어 있습니다. Visual Studio가 더 이상 설치되어 있지 않으면 Windows 레지스트리를 편집하여 Just-In-Time 디버깅을 비활성화할 수 있습니다.

레지스트리를 편집하여 Just-In-Time 디버깅을 비활성화하려면:

  1. Windows 시작 메뉴에서 레지스트리 편집기(regedit.exe)를 실행합니다.

  2. 레지스트리 편집기 창에서 다음 레지스트리 항목을 찾아 있으면 삭제합니다.

    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\DbgManagedDebugger

    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

    JIT 레지스트리 키

  3. 다음 레지스트리 항목도 있으면 삭제합니다.

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

    다른 레지스트리 키를 삭제하거나 변경하지 않도록 해야 합니다.

  4. 레지스트리 편집기 창을 닫습니다.

Windows Form의 Just-In-Time 디버깅 사용

기본적으로 Windows Forms 앱에는 복구할 수 있는 경우 앱을 계속 실행할 수 있도록 하는 최상위 예외 처리기가 있습니다. Windows Forms 앱이 처리되지 않은 예외를 throw하는 경우 다음과 같은 대화 상자가 표시됩니다.

Windows Form 처리되지 않은 예외

표준 Windows Form 오류 처리 대신 Just-In-Time 디버깅을 사용하도록 설정하려면 다음 설정을 추가합니다.

  • machine.config 또는 <app name>.exe.config 파일의 system.windows.forms 섹션에서 jitDebugging 값을 true로 설정합니다.

    <configuration>
        <system.windows.forms jitDebugging="true" />
    </configuration>
    
  • C++ Windows Forms 애플리케이션의 경우 .config 파일 또는 코드에서 DebuggableAttributetrue로 설정합니다. /Zi만 사용하고 /Og는 사용하지 않은 상태에서 컴파일하면 컴파일러에서 이 특성을 자동으로 설정합니다. 그러나 최적화되지 않은 릴리스 빌드를 디버그하려면 앱의 AssemblyInfo.cpp 파일에 다음 줄을 추가하여 DebuggableAttribute를 설정해야 합니다.

    [assembly:System::Diagnostics::DebuggableAttribute(true, true)];
    

    자세한 내용은 DebuggableAttribute를 참조하세요.

Just-In-Time 디버깅 사용

이 예제에서는 앱에서 오류를 throw할 때 Just-In-Time 디버깅을 안내합니다.

  • 이러한 단계를 수행하려면 Visual Studio가 설치되어 있어야 합니다. Visual Studio가 없는 경우 체험판 Visual Studio Community Edition을 다운로드할 수 있습니다.

  • 도구>옵션>디버깅>Just-In-Time에서 Just-In-Time 디버깅을 사용하도록 설정해야 합니다.

이 예제에서는 Visual Studio에서 NullReferenceException을 throw하는 C# 콘솔 앱을 만듭니다.

  1. Visual Studio에서 ThrowsNullException이라는 C# 콘솔 앱(파일>새로 만들기>프로젝트>Visual C#>콘솔 애플리케이션)을 만듭니다. Visual Studio에서 프로젝트를 만드는 방법에 대한 자세한 내용은 연습: 간단한 애플리케이션 만들기를 참조하세요.

  2. Visual Studio에서 프로젝트가 열리면 Program.cs 파일을 엽니다. Main() 메서드를 콘솔에 줄을 출력한 다음, NullReferenceException을 throw하는 다음 코드로 바꿉니다.

    static void Main(string[] args)
    {
        Console.WriteLine("we will now throw a NullReferenceException");
        throw new NullReferenceException("this is the exception thrown by the console app");
    }
    
  3. 솔루션을 빌드하려면 디버그(기본값) 또는 릴리스 구성 중 하나를 선택한 다음, 빌드>솔루션 다시 빌드를 선택합니다.

    참고

    • 전체 디버깅 환경에 대한 디버그 구성을 선택합니다.
    • 릴리스 구성을 선택하는 경우 이 절차를 수행하려면 내 코드만을 해제해야 합니다. 도구>옵션>디버깅에서 내 코드만 사용을 선택 취소합니다.

    빌드 구성에 대한 자세한 내용은 빌드 구성 이해를 참조하세요.

  4. C# 프로젝트 폴더( ...\ThrowsNullException\ThrowsNullException\bin\Debug 또는 ...\ThrowsNullException\ThrowsNullException\bin\Release)에서 빌드된 앱 ThrowsNullException.exe를 엽니다.

    다음 명령 창이 표시됩니다.

    처리되지 않은 null 참조 예외(System.NullReferenceException)를 throw하는 ThrowsNullException.exe에 대한 콘솔의 스크린샷

  5. Just-In-Time 디버거 선택 대화 상자가 열립니다.

    ThrowsNullException.exe 콘솔 창에 예외가 표시된 후 나타나는 Just-In-Time 디버거 선택 대화 상자의 스크린샷

    사용 가능한 디버거에서 <기본 설정된 Visual Studio 버전/에디션>의 새 인스턴스를 선택합니다(아직 선택하지 않은 경우).

  6. 확인을 선택합니다.

    ThrowsNullException 프로젝트는 예외를 throw한 줄에서 실행이 중지되는 Visual Studio의 새 인스턴스에서 열립니다.

    예외를 throw한 소스 코드 줄을 강조 표시하는 Visual Studio의 ThrowsNullException 프로젝트 스크린샷

이 지점에서 디버깅을 시작할 수 있습니다. 실제 앱을 디버깅하는 경우 코드에서 예외를 throw하는 이유를 확인해야 합니다.

주의

앱에 신뢰할 수 없는 코드가 포함된 경우 디버깅을 계속할지 여부를 결정할 수 있는 보안 경고 대화 상자가 나타납니다. 디버깅을 계속하기 전에 코드를 신뢰할 수 있는지 확인해야 합니다. 직접 작성한 코드인지, 애플리케이션이 원격 컴퓨터에서 실행 중인 경우 프로세스 이름을 알 수 있는지 등을 확인합니다. 앱이 로컬로 실행 중인 경우 컴퓨터에서 악성 코드가 실행될 가능성을 고려합니다. 코드를 신뢰할 수 있다고 판단되면 확인을 선택합니다. 그렇지 않으면 취소를 선택합니다.

Just-In-Time 디버깅 문제 해결

Visual Studio에서 앱을 사용하도록 설정했지만 앱이 충돌할 때 Just-In-Time 디버깅이 시작되지 않는 경우:

  • 알려진 Windows 문제로 인해 Just-In-Time 디버거가 실패할 수 있습니다.

    이 문제를 해결하려면 값 데이터1DWORD 값자동으로 다음 레지스트리 키에 추가합니다.

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

    • (64비트 컴퓨터의 32비트 앱의 경우) HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug

  • Windows 오류 보고가 컴퓨터의 오류 처리를 대신할 수 있습니다.

    이 문제를 해결하려면 레지스트리 편집기를 사용하여 값 데이터1DWORD 값사용 안함으로 다음 레지스트리에 추가합니다.

    • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows 오류 보고

    • (64비트 컴퓨터의 32비트 앱의 경우) HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows\Windows 오류 보고

    자세한 내용은 .WER 설정을 참조하세요.

Just-In-Time 디버깅 중에 다음 오류 메시지가 표시될 수 있습니다.

  • 충돌 프로세스에 연결할 수 없습니다. 지정한 프로그램은 Windows 또는 MS-DOS 프로그램이 아닙니다.

    디버거가 다른 사용자로 실행 중인 프로세스에 연결하려고 했습니다.

    이 문제를 해결하려면 Visual Studio에서 디버그>프로세스에 연결을 열고(또는 Ctrl + Alt + P를 누르고), 사용 가능한 프로세스 목록에서 디버깅할 프로세스를 찾습니다. 프로세스 이름을 모르는 경우에는 Visual Studio Just-In-Time 디버거 대화 상자에서 프로세스 ID를 찾습니다. 사용 가능한 프로세스 목록에서 프로세스를 선택하고 연결을 선택합니다. 아니요를 선택하여 Just-In-Time 디버거 대화 상자를 닫습니다.

  • 로그온한 사용자가 없으므로 디버거를 시작할 수 없습니다.

    콘솔에 로그온한 사용자가 없으므로 Just-In-Time 디버깅 대화 상자를 표시할 사용자 세션이 없습니다.

    이 문제를 해결하려면 컴퓨터에 로그온합니다.

  • 클래스가 등록되지 않았습니다.

    디버거가 설치 문제로 인해 등록되지 않은 COM 클래스를 만들려고 했습니다.

    이 문제를 해결하려면 Visual Studio 설치 관리자를 사용하여 Visual Studio 설치를 다시 설치하거나 복구합니다.