다음을 통해 공유


Visual Studio 확장 디버그

Visual Studio 확장을 디버그할 때 기본 Visual Studio IDE에서 디버거를 실행하는 동안 실험적 인스턴스라는 Visual Studio의 특수 인스턴스가 확장을 호스트하는 데 사용됩니다. 두 인스턴스는 독립적으로 나란히 실행됩니다. 이 문서에서는 Visual Studio IDE의 실험적 인스턴스에서 실행할 때 VisualStudio.Extensibility SDK로 만든 확장을 디버그하는 방법을 설명합니다.

확장 프로세스

디버깅 프로세스는 확장이 In-process 또는 out-of-process로 실행되는지에 따라 약간 다릅니다. 첫 번째 VSSDK 호환 VisualStudio.Extensibility 확장 만들기를 참조하세요. Out-of-process 확장을 사용하면 확장이 Visual Studio 확장 전용 프로세스에서 실행됩니다. 이 프로세스는 Microsoft.ServiceHub.Host.ExtensibilityVisual Studio의 IDE 프로세스와 확장을 호스팅하는 프로세스 간의 모든 통신을 조정합니다. F5를 사용하여 확장을 시작하면 Visual Studio에서 Visual Studio 실험적 인스턴스를 시작하고 확장을 호스트하는 프로세스에 연결합니다. Visual Studio IDE를 눌러 F5 확장 프로젝트에서 디버거를 시작할 때 Visual Studio는 디버거를 연결할 올바른 프로세스를 찾기 때문에 일반적으로 정확한 프로세스에 대해 걱정할 필요가 없습니다.

디버그 세션을 시작하면 확장 어셈블리와 해당 기호가 즉시 로드되지 않습니다. 확장이 로드되기 전에 Visual Studio는 확장을 활성화할 수 있는 위치를 추적합니다. 이 정보는 내부 인스턴스에서 관리됩니다 VisualStudioContribution. 확장이 로드되기 전에도 Visual Studio에는 사용자가 특정 메뉴 항목을 선택하거나 도구 모음 단추를 누르거나 특정 형식의 파일을 편집기에 로드하는 경우와 같이 활성화될 수 있는 위치에 대한 정보가 있습니다. 확장의 어셈블리는 IDE에서 활성화될 때까지 로드되지 않습니다. 따라서 디버깅할 때 가장 먼저 해야 할 일은 Visual Studio IDE에서 작업을 수행하여 로드할 확장을 트리거하는 것입니다. 예를 들어 확장의 메뉴 항목 또는 도구 모음 단추를 선택해야 할 수 있습니다. 이때 확장 어셈블리가 로드되고 초기화 코드가 실행되며 중단점에 도달하고 코드를 단계별로 실행할 수 있습니다. 확장에서 처음 실행되는 코드는 Extension 클래스의 InitializeAsync 메서드이고, 다음 메서드는 InitializeServices입니다.

프로세스 및 호출 스택

확장이 진행 중인 경우 호출 스택에는 Visual Studio 스택 프레임과 확장의 스택 프레임이 포함됩니다. 일반적으로 Visual Studio에서는 기호를 사용할 수 없지만 Visual Studio에서 확장을 호출하는 호출을 볼 수 있습니다.

Out-of-process 확장을 사용하면 확장의 호출 스택만 표시됩니다. Visual Studio 스택 프레임은 별도의 프로세스에 있습니다. Visual Studio는 JsonRpc 호환 인터페이스를 통해 확장을 호출하고 ServiceHub 호스트는 호출을 라우팅한 다음 프로세스의 실행이 콜백에서 시작됩니다. 콜백이 반환되면 컨트롤이 Visual Studio로 돌아갑니다.

상태는 필요에 따라 다양한 방법으로 확장에 전달되고 사용하기 쉽도록 IClientContext 인스턴스에 의해 래핑됩니다. 그러나 스냅샷의 상태는 스냅샷 시간과 확장 코드에서 읽거나 디버거에서 보는 시간 사이에 변경될 수 있다는 점을 고려하는 것이 중요합니다.

ServiceHub 호스트 프로세스에는 RPC(원격 프로시저 호출) 조정을 처리하는 몇 가지 내부 코드가 있습니다. 이 계층에서 오류가 발생하면 표시되지 않습니다. 이러한 오류는 제품 문제로 보고되어야 합니다.

Visual Studio의 실험적 인스턴스에서 확장 디버그

  1. 확장 프로젝트를 엽니다.

  2. 예를 들어, 메인 클래스가 Extension에서 파생된 경우 그 클래스의 InitializeServices 메서드에 중단점을 설정합니다. 코드 줄에 중단점을 설정하려면 줄을 클릭하고 키를 누릅니다 F9.

  3. 주 메뉴에서 디버그 > 시작 디버깅을 선택하거나 F5를 누릅니다. Visual Studio 실험적 인스턴스가 시작됩니다. 동시에 ServiceHub 호스트 프로세스가 시작됩니다.

  4. Visual Studio의 실험적 인스턴스에서 확장을 활성화하거나 디버그하려는 시나리오를 재현하는 단계를 실행합니다.

  5. Visual Studio는 중단점에서 중지됩니다.

    확장을 디버깅하는 Visual Studio를 보여 주는 스크린샷

팁 (조언)

여러 모니터를 사용하는 것이 편리할 수 있으므로 서로 다른 두 모니터에서 디버거와 실험적 인스턴스를 동시에 볼 수 있습니다. 실험적 인스턴스의 테마를 변경하여 지정된 시간에 작업 중인 IDE를 더 명확히 할 수 있습니다. Visual Studio에서 글꼴, 색 및 테마 변경을 참조하세요.

진단 탐색기를 사용하여 확장 디버그

자세한 내용은 VisualStudio.Extensibility Diagnostics Explorer 를 참조하세요.

Troubleshooting

디버거를 시작할 때 현재 제품에서 이 확장이 지원되지 않는다는 오류가 표시되면 파일을 열고 .vsixmanifest 요소를 확인합니다 InstallationTarget . 설치 대상 Microsoft.VisualStudio.IntegratedShell 은 지원되지 않습니다. 대신 사용합니다 Microsoft.VisualStudio.Community . VSIX 확장 스키마 2.0 참조를 참조하세요.