다음을 통해 공유


.NET에서 이미지를 더 쉽게 디버그할 수 있도록 만들기

비고

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

관리되지 않는 코드를 컴파일할 때 IDE 스위치 또는 명령줄 옵션을 설정하여 디버깅을 위한 실행 파일을 구성할 수 있습니다. 예를 들어 Visual C++에서 /Zi 명령줄 옵션을 사용하여 디버그 기호 파일(파일 확장명 .pdb)을 내보내도록 요청할 수 있습니다. 마찬가지로 /Od 명령줄 옵션은 컴파일러에 최적화를 사용하지 않도록 설정합니다. 결과 코드는 더 느리게 실행되지만 필요한 경우 디버그하기가 더 쉽습니다.

.NET Framework 관리 코드를 컴파일할 때 Visual C++, Visual Basic 및 C#과 같은 컴파일러는 원본 프로그램을 CIL(공용 중간 언어)로 컴파일합니다. 그런 다음, CIL은 실행 직전에 네이티브 머신 코드로 JIT 컴파일됩니다. 관리되지 않는 코드와 마찬가지로 IDE 스위치 또는 명령줄 옵션을 설정하여 디버깅을 위한 실행 이미지를 구성할 수 있습니다. 동일한 방식으로 디버깅을 위해 JIT 컴파일을 구성할 수도 있습니다.

이 JIT 구성에는 두 가지 측면이 있습니다.

  • JIT 컴파일러에 추적 정보를 생성하도록 요청할 수 있습니다. 이렇게 하면 디버거가 CIL 체인을 해당 머신 코드와 일치시키고 지역 변수 및 함수 인수가 저장되는 위치를 추적할 수 있습니다. .NET Framework 버전 2.0 이상에서는 JIT 컴파일러가 항상 추적 정보를 생성하므로 요청할 필요가 없습니다.

  • 결과 컴퓨터 코드를 최적화하지 않도록 JIT 컴파일러를 요청할 수 있습니다.

일반적으로 CIL을 생성하는 컴파일러는 지정한 IDE 스위치 또는 명령줄 옵션(예: /Od)에 따라 이러한 JIT 컴파일러 옵션을 적절하게 설정합니다.

경우에 따라 JIT 컴파일러의 동작을 변경하여 생성하는 컴퓨터 코드를 디버그하기 쉽도록 할 수 있습니다. 예를 들어 소매 빌드 또는 컨트롤 최적화에 대한 JIT 추적 정보를 생성할 수 있습니다. 초기화(.ini) 파일을 사용하여 이 작업을 수행할 수 있습니다.

예를 들어 디버그하려는 어셈블리가 MyApp.exe호출되는 경우MyApp.exe같은 폴더에 MyApp.ini이라는 텍스트 파일을 만들 수 있습니다. 여기에는 다음 세 줄이 포함됩니다.

[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0

각 옵션의 값을 0 또는 1로 설정할 수 있으며, 없는 옵션은 기본적으로 0으로 설정됩니다. 1과 0으로 GenerateTrackingInfo을 설정하고 AllowOptimize을 설정하면 디버깅을 쉽게 할 수 있습니다.

.NET Framework 2.0부터 JIT 컴파일러는 값 GenerateTrackingInfo에 관계없이 항상 추적 정보를 생성합니다. 그러나 AllowOptimize 값은 여전히 영향을 줍니다. Ngen.exe(네이티브 이미지 생성기)를 사용하여 최적화 없이 네이티브 이미지를 미리 컴파일하는 경우 Ngen.exe 실행될 때 .ini 파일이 대상 폴더 AllowOptimize=0 에 있어야 합니다. 최적화 없이 어셈블리를 미리 컴파일한 경우 Ngen.exe 다시 실행하기 전에 NGen.exe /uninstall 옵션을 사용하여 미리 컴파일된 코드를 제거하여 코드를 최적화된 대로 미리 컴파일해야 합니다. .ini 파일이 폴더에 없는 경우 기본적으로 Ngen.exe 코드를 최적화된 대로 미리 컴파일합니다.

System.Diagnostics.DebuggableAttribute 어셈블리에 대한 설정을 제어합니다. DebuggableAttribute 에는 JIT 컴파일러가 추적 정보를 최적화 및/또는 생성해야 하는지 여부를 제어하는 두 개의 필드가 포함되어 있습니다. .NET Framework 2.0 이상 버전에서 JIT 컴파일러는 항상 추적 정보를 생성합니다.

소매 빌드의 경우 컴파일러는 DebuggableAttribute를 설정하지 않습니다. 기본적으로 JIT 컴파일러는 컴퓨터 코드를 디버그하기 어려운 가장 높은 성능을 생성합니다. JIT 추적을 사용하도록 설정하면 성능이 약간 저하되고 최적화를 사용하지 않도록 설정하면 성능이 훨씬 낮아질 수 있습니다.

DebuggableAttribute는 어셈블리 내의 개별 모듈이 아니라 한 번에 전체 어셈블리에 적용됩니다. 따라서 개발 도구는 어셈블리가 이미 만들어진 경우 어셈블리 메타데이터 토큰 또는 System.Runtime.CompilerServices.AssemblyAttributesGoHere라는 클래스에 사용자 지정 특성을 연결해야 합니다. 그런 다음 ALink 도구는 이러한 DebuggableAttribute 특성을 각 모듈에서 해당 모듈의 일부가 되는 어셈블리로 승격합니다. 충돌이 발생하면 ALink 작업이 실패합니다.

비고

.NET Framework 버전 1.0에서 Microsoft Visual C++ 컴파일러는 /clr/Zi 컴파일러 옵션이 지정될 때 DebuggableAttribute를 추가합니다. .NET Framework 버전 1.1에서는 코드에 DebuggableAttribute를 수동으로 추가하거나 /ASSEMBLYDEBUG 링커 옵션을 사용해야 합니다.

참고하십시오