.NET 애플리케이션을 디버그할 때 없는 소스 코드를 보려고 할 수 있습니다. 예를 들어 예외가 발생할 때 실행을 중단하거나 호출 스택을 통해 소스 코드 위치로 탐색합니다.
비고
- 소스 코드 생성(디컴파일)은 .NET 애플리케이션에만 사용할 수 있으며 오픈 소스 ILSpy 프로젝트를 기반으로 합니다.
- 디컴필레이션은 Visual Studio 2019 16.5 이상에서만 사용할 수 있습니다.
- SuppressIldasmAttribute 특성을 어셈블리 또는 모듈에 적용하면 Visual Studio에서 디컴퓨팅을 시도할 수 없습니다. .NET 6 이상에서는 특성이 사용되지 않지만 Visual Studio는 이 특성을 적용합니다.
소스 코드 생성
디버깅 중이고 소스 코드를 사용할 수 없는 경우 Visual Studio에서 소스 찾을 수 없음 문서를 표시하거나 어셈블리에 대한 기호가 없는 경우 기호가 로드되지 않은 문서를 표시합니다. 두 문서에는 현재 위치에 대한 C# 코드를 생성하는 디컴파일 소스 코드 옵션이 있습니다. 생성된 C# 코드는 다른 소스 코드와 마찬가지로 사용할 수 있습니다. 코드를 보고, 변수를 검사하고, 중단점을 설정하는 등의 작업을 수행할 수 있습니다.
로드된 기호 없음
다음 그림에서는 기호가 로드되지 않은 메시지를 보여 줍니다.
원본을 찾을 수 없음
다음 그림에서는 소스 찾을 수 없음 메시지를 보여 줍니다.
자동 역컴파일 코드
Visual Studio 2022 버전 17.7부터 Visual Studio 디버거는 외부 .NET 코드의 자동 컴파일을 지원합니다. 외부 코드를 단계별로 실행하거나 호출 스택 창을 사용할 때 자동 컴파일할 수 있습니다.
외부에서 구현된 코드를 한 단계씩 실행하면 디버거가 자동으로 디컴파일하고 현재 실행 지점을 표시합니다. 외부 코드를 한 단계씩 실행하려면 내 코드만 사용하지 않도록 설정합니다.
내 코드만 사용하지 않도록 설정하지 않고 호출 스택 창에서 디컴파일할 수 있습니다.
호출 스택 창에서 자동 컴파일하려면 다음을 수행합니다.
호출 스택 창을 열어 디버깅하는 동안 외부 코드 표시를 선택합니다.
호출 스택 창에서 스택 프레임을 두 번 클릭합니다. 디버거는 코드를 디컴포지션한 다음 현재 실행 지점으로 직접 이동합니다.
디컴파일된 모든 코드는 솔루션 탐색기의 외부 소스 하에 표시되므로. 필요한 경우 외부 파일을 더 쉽게 탐색할 수 있습니다.
디컴파일된 코드를 디버그하고 중단점을 설정할 수 있습니다.
외부 코드의 자동 디컴퓨션을 사용하지 않도록 설정하려면 다음을 수행합니다.
도구>옵션 창을 열고 모든 설정>디버깅> 섹션을 확장합니다.
오른쪽 창에서 필요한 경우 원본에 자동으로 디컴파일(관리 전용) 확인란의 선택을 취소합니다.
도구>옵션 대화 상자를 열고 디버깅> 섹션을 확장합니다.
오른쪽 창에서 필요한 경우 원본에 자동으로 디컴파일(관리 전용) 확인란의 선택을 취소합니다.
확인을 선택합니다.
어셈블리에 대한 원본 생성 및 포함
특정 위치에 대한 소스 코드를 생성하는 것 외에도 지정된 .NET 어셈블리에 대한 모든 소스 코드를 생성할 수 있습니다. 이 작업을 수행하려면 모듈 창과 .NET 어셈블리의 상황에 맞는 메뉴에서 이동한 다음 소스에서 기호 파일로 디컴파일 명령을 선택합니다. Visual Studio는 어셈블리에 대한 기호 파일을 생성한 다음, 원본을 기호 파일에 포함합니다. 이후 단계에서 포함된 소스 코드를 추출 할 수 있습니다.
포함된 소스 코드 추출 및 보기
모듈 창의 상황에 맞는 메뉴에서 소스 코드 추출 명령을 사용하여 기호 파일에 포함된 소스 파일을 추출할 수 있습니다.
추출된 소스 파일은 솔루션에 기타 파일로 추가됩니다. 기타 파일 기능은 Visual Studio에서 기본적으로 해제되어 있습니다. 기능을 사용하도록 설정하지 않으면 추출된 소스 코드를 열 수 없습니다.
도구>옵션 메뉴에서 기능을 사용하도록 설정할 수 있습니다.
도구>옵션 창을 열고 모든 설정>환경>문서 섹션을 확장합니다.
오른쪽 창에서 솔루션 탐색기에서 기타 파일 표시 확인란을 선택하거나 선택 취소합니다.
옵션을 선택하면 기타 파일 프로젝트에 저장된 항목 수를 지정할 수 있습니다.
변경 내용을 적용하려면 Visual Studio를 다시 시작합니다.
도구>옵션 대화 상자를 열고 환경>문서 섹션을 확장합니다.
오른쪽 창에서 솔루션 탐색기에서 기타 파일 표시 확인란을 선택하거나 선택 취소합니다.
옵션을 선택하면 기타 파일 프로젝트에 저장된 항목 수를 지정할 수 있습니다.
확인을 선택합니다.
추출된 원본 파일은 솔루션 탐색기의 기타 파일에 표시됩니다.
SourceLink
.NET 라이브러리 또는 SourceLink에 사용하도록 설정된 NuGet 패키지의 경우 소스 코드를 한 단계씩 실행하고 중단점을 설정하며 모든 디버거 기능을 사용할 수도 있습니다. 자세한 내용은 Source Link를 사용하여 디버깅 및 진단 사용 및 SourceLink 를 사용하여 디버그 시간 생산성 향상을 참조하세요.
알려진 제한 사항
중단 모드 필요
디버거가 중단 모드이고 애플리케이션이 일시 중지된 경우에만 디컴파일을 사용하여 소스 코드를 생성할 수 있습니다. 예를 들어 Visual Studio는 중단점 또는 예외에 도달하면 중단 모드로 전환됩니다. 다음 번에 코드를 실행할 때 Visual Studio에서 쉽게 중단 걸릴 수 있도록 모두 중단 명령(
)을 사용할 수 있습니다.
디컴필레이션 제한 사항
.NET 어셈블리에 사용되는 IL(중간 형식)에서 소스 코드를 생성하는 데는 몇 가지 내재된 제한 사항이 있습니다. 따라서 생성된 소스 코드는 원래 소스 코드와 같지 않습니다. 대부분의 차이점은 런타임에 원래 소스 코드의 정보가 필요하지 않은 위치에 있습니다. 예를 들어 공백, 주석 및 지역 변수의 이름과 같은 정보는 런타임에 필요하지 않습니다. 생성된 소스를 사용하여 원래 소스 코드를 대체하는 것이 아니라 프로그램이 실행되는 방식을 이해하는 것이 좋습니다.
최적화된 어셈블리 또는 릴리스 어셈블리를 디버그합니다.
컴파일러 최적화를 사용하여 컴파일된 어셈블리에서 코드를 디버깅하는 경우 다음과 같은 문제가 발생할 수 있습니다.
- 중단점은 항상 일치하는 소스 위치에 바인딩되지 않을 수 있습니다.
- 단계별 실행이 항상 올바른 위치로 이동하지 않을 수 있습니다.
- 지역 변수에 정확한 이름이 없을 수 있습니다.
- 일부 변수는 평가에 사용할 수 없을 수 있습니다.
자세한 내용은 GitHub 문제: VS 디버거에 ICSharpCode.Decompiler 통합에서 찾을 수 있습니다.
디컴필레이션 안정성
상대적으로 적은 비율의 디컴필레이션 시도가 실패할 수 있습니다. 이 동작은 ILSpy의 시퀀스 지점 null 참조 오류 때문입니다. 이러한 문제를 포착하고 디컴파일 시도에서 우아하게 실패하여 오류를 완화했습니다.
자세한 내용은 GitHub 문제: VS 디버거에 ICSharpCode.Decompiler 통합에서 찾을 수 있습니다.
비동기 코드의 제한 사항
비동기/대기 코드 패턴으로 모듈을 디컴파일한 결과는 불완전하거나 완전히 실패할 수 있습니다. async/await 및 yield 상태 컴퓨터의 ILSpy 구현은 부분적으로만 구현됩니다.
자세한 내용은 GitHub 문제( PDB 생성기 상태)에서 찾을 수 있습니다.
내 코드만
JMC(내 코드만) 설정을 사용하면 Visual Studio에서 시스템, 프레임워크, 라이브러리 및 기타 비사용자 호출을 단계별로 실행할 수 있습니다. 디버깅 세션 중에 모듈 창에는 디버거가 내 코드(사용자 코드)로 처리하는 코드 모듈이 표시됩니다.
최적화된 모듈 또는 릴리스 모듈을 분해하면 비사용자 코드가 생성됩니다. 디버거가 디컴퍼지된 비사용자 코드에서 중단되는 경우(예: 소스 없음 ) 창이 나타납니다. 도구 옵션 또는 >옵션 메뉴에서 > 기능을 사용하지 않도록 설정할 수있습니다.
도구>옵션 창을 열고 모든 설정>디버깅> 섹션을 확장합니다. 내 코드만 사용 확인란의 선택을 취소합니다.
도구>옵션 대화 상자를 열고 디버깅> 섹션을 확장합니다. 내 코드만 사용 확인란의 선택을 취소합니다.
추출된 원본
어셈블리에서 추출된 소스 코드에는 다음과 같은 제한 사항이 있습니다.
- 생성된 파일의 이름과 위치는 구성할 수 없습니다.
- 파일이 임시이며 Visual Studio에서 삭제됩니다.
- 파일은 단일 폴더에 배치되고 원래 원본이 사용했던 폴더 계층 구조는 사용되지 않습니다.
- 각 파일의 파일 이름에는 파일의 체크섬 해시가 포함됩니다.
생성된 코드는 C#에만 해당합니다.
디컴파일은 C#에서만 소스 코드 파일을 생성합니다. 다른 언어로 파일을 생성하는 옵션은 없습니다.