.NET에서 가능한 중복 디버그 Visual Studio 릴리스
Visual Studio에서 디버그와 릴리스의 차이점은 무엇입니까?
.NET에서 가능한 중복 디버그 Visual Studio 릴리스
Visual Studio에서 디버그와 릴리스의 차이점은 무엇입니까?
답변:
가장 중요한 것은 디버그 모드에서는 최적화가없고 릴리스 모드에서는 최적화가 있다는 것입니다. 이것은 컴파일러가 매우 고급이고 코드를 매우 까다로운 저수준으로 개선 할 수 있기 때문에 중요합니다. 결과적으로 코드의 일부 행이 지침없이 남거나 일부가 모두 뒤섞 일 수 있습니다. 단계별 디버깅은 불가능합니다. 또한 지역 변수는 종종 신비한 방식으로 최적화되기 때문에 변수가 "최적화"되어 있기 때문에 Watches 및 QuickWatch가 작동하지 않는 경우가 많습니다. 그리고 다른 최적화도 많이 있습니다. 언젠가 최적화 된 .NET 코드를 디버깅 해보십시오.
또 다른 주요 차이점은 이로 인해 기본 릴리스 설정이 광범위한 디버그 기호 정보를 생성하는 데 신경 쓰지 않는다는 것입니다. 이 파일은 .PDB 파일이며 디버거가 어떤 어셈블리 명령이 어떤 코드 줄에 해당하는지 파악할 수 있도록합니다.
"Debug"와 "Release"는 실제로 빌드 및 디버깅에 영향을 줄 수있는 전체 설정에 대한 두 개의 레이블입니다.
"디버그"모드에서는 일반적으로 다음이 있습니다.
"Release"모드에서는 최적화가 켜져 있고 (사용 가능한 여러 옵션이 있지만) _DEBUG 전 처리기 정의가 정의되어 있지 않습니다. 일반적으로 PDB 파일을 생성하고 싶을 것입니다. 작업이 더 빨리 실행될 때 릴리스 모드에서 "디버그"할 수있는 것이 매우 유용하기 때문입니다.
대부분 디버그에는 디버깅 할 때 유용한 추가 정보가 많이 포함되어 있습니다. 릴리스 모드에서는이 모든 것이 성능을 위해 잘리고 교환됩니다.
프로젝트 컴파일 옵션을 살펴보고 비교하면 차이점이 무엇인지 알 수 있습니다.
질문이 네이티브 / C ++ 코드에 관한 것이라고 가정합니다 (구문에서 완전히 명확하지 않음).
기본적으로 디버그에서 모든 코드 생성 최적화가 꺼져 있습니다. 일부 라이브러리 (예 : STL )는 기본적으로 더 엄격한 오류 검사 (예 : 디버그 반복기)를 사용합니다. 더 많은 디버깅 정보가 생성됩니다 (예 : "편집 및 계속"). 오류를 포착하기 위해 코드에서 더 많은 것들이 생성됩니다 (로컬 변수 값은 초기화되지 않은 패턴으로 설정되고 디버그 힙이 사용됨).
또한 디버그 모드는 디버깅에 도움이되는 많은 추가 스레드를 생성합니다. 디버거 연결 여부에 관계없이 프로세스 수명 동안 활성 상태로 유지됩니다. 여기 내 관련 질문을 참조 하십시오 .
빌드 플래그는 로깅 및 "콘솔"메시징을 변경하는 데만 사용해야 하는 다른 로직을 허용 하지만 남용 될 수 있으며 하위 수준뿐 아니라 실제 비즈니스 로직도 크게 변경 될 수 있다는 점은 매우 분명한 사실을 언급 할 가치 가 있습니다 .
또한 예를 들어 MFC 를 사용할 때 디버그 프로젝트는 재배포 불가능한 DLL 버전 MFC90D.DLL
에 대해 링크하는 반면 릴리스 빌드는 다음과 같은 재배포 가능 버전에 대해 링크합니다.MFC90.DLL
. 이것은 아마도 다른 프레임 워크와 유사합니다.
따라서 개발되지 않은 컴퓨터에서는 디버그 빌드 응용 프로그램을 실행할 수 없습니다.
기존 릴리스 빌드 구성에서 복사 한 애플리케이션을 개발했을 때도이 질문에 대해 궁금해했습니다.
디버그 모드에서 해당 응용 프로그램을 사용하는 데 관심이있는 개발자가 있으므로 Release 구성에서 복사 한 ReleaseMyBuild 이름으로 존재하는이 빌드 구성을 만들려면 어떻게해야하는지 궁금했습니다 (따라서 모든 설정이 릴리스 최적화에 맞게 조정되어야합니다). ) 혼란스러운 빌드 구성 이름에도 불구하고 갑자기 팀을 변경하고 디버그 빌드가됩니다.
저는 프로젝트 구성이 이름 일 뿐이며 Joris Timmermans가 언급 한 "모든 설정"을 선택하는 편리한 방법이라고 생각했습니다. "FOO"라는 빌드 구성이 최적화 된 릴리스 로 작동하도록하는 설정이 무엇인지에 대한 핵심을 알고 싶었습니다. 빌드 .
여기에 한 가지 엿볼 수 있습니다. Visual Studio 2010의 빈 프로젝트 템플릿에서 새 VCXPROJ를 만들었습니다. 그런 다음이를 복사하고 둘 다 편집했습니다. 첫 번째는 디버그 콘텐츠를 유지하고 두 번째는 릴리스 콘텐츠를 유지했습니다. 관련 차이점을 중심으로 한 차이점은 다음과 같습니다.
해제
<PropertyGroup>
<WholeProgramOptimization>true</WholeProgramOptimization>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
디버그
<PropertyGroup>
<UseDebugLibraries>true</UseDebugLibraries>`
<ClCompile>
<Optimization>Disabled</Optimization>
링크 섹션에서 둘 다 GenerateDebugInformation
true로 설정 한 것이 흥미 롭습니다 .
분명한 차이점은 바이너리의 크기입니다. 디버그 빌드는 릴리스 빌드보다 더 큰 바이너리를 생성합니다.
디버그에서 컴파일 할 때 심볼 테이블이 코드 파일의 컴파일 된 개체에 추가되어 디버깅 프로그램이 이러한 바이너리를 활용하고 개체 및 변수의 값에 액세스 할 수 있습니다.
또 다른 눈에 띄는 차이점은 릴리스 모드에서 디버그 모드에있는 동안 바이너리가 치명적인 오류로 인해 충돌이 발생한다는 것입니다. Visual Studio에서 애플리케이션 디버깅을 시작하면 오류가있는 문의 정확한 위치를 알려주는 호출 스택을 확인할 수 있습니다. .
실제로 쉽게 사용할 수있는 정보가 없기 때문에 정확한 차이점이 무엇인지 모르겠습니다.
그러나 관찰 된 주요 차이점은 릴리스 버전이 결과 DLL 파일을 손상시켜 응용 프로그램, 웹 응용 프로그램을 사용할 수 없게 만든다는 것입니다.
슬프게도 프로덕션에 디버그 빌드를 넣어야합니다. 그리고 예, 게시하려면 좋은 오래된 FTP를 사용해야합니다.