developer tip

.NET의 디버그 대 릴리스

copycodes 2021. 1. 7. 08:08
반응형

.NET의 디버그 대 릴리스


이전 질문에 이어 C # 애플리케이션, 특히 웹 애플리케이션에서 디버그 및 릴리스 모드간에 사용 가능한 모든 차이점을 나열하는 포괄적 인 문서가 있습니까?

어떤 차이점이 있습니까?


"Debug"및 "Release"는 Visual Studio에서 정의한 미리 정의 된 프로젝트 구성의 이름 일뿐입니다.
차이점을 확인하려면 Visual Studio의 프로젝트 속성에서 빌드 탭을 확인하세요.

VS2005의 차이점은 다음과 같습니다.

  • 디버그 구성에 정의 된 DEBUG 상수

  • 릴리스 구성에서 활성화 된 코드 최적화

"고급"버튼을 클릭하여 확인할 수있는 기타 차이점

하지만 당신은 할 수 있습니다:

  • 프로젝트 속성 / 빌드에서 디버그 및 릴리스 구성에 대한 빌드 설정 변경

  • 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 구성 관리자를 선택하여 사용자 지정 구성을 만듭니다.

DEBUG 상수의 동작은 상당히 명확하다고 생각합니다 (#if 전 처리기 지시문 또는 ConditionalAttribute에서 참조 할 수 있음). 하지만 정확히 어떤 최적화가 활성화되어 있는지에 대한 포괄적 인 문서를 알지 못합니다. 사실 Microsoft가 사전 통지없이 최적화 프로그램을 향상시킬 수 있기를 원할 것입니다.


차이점을 나열하는 문서가 하나도 없습니다. 이미 나열된 몇 가지 차이점 외에도 디버그 모드에서 컴파일하면 런타임에 수행되는 대부분의 JIT 컴파일러 최적화가 해제되고 심볼 데이터베이스 파일 (.pdb)에 더 완전한 디버그 정보가 방출됩니다.

또 다른 큰 차이점은 JIT 컴파일러가 디버깅 세션을 지원하기 위해 적절하거나 필요 에 따라 GC.KeepAlive () 호출을 삽입한다는 점에서 GC 동작이 다소 다르다는 것 입니다.


간결한 문서 하나는 모르지만 다음과 같습니다.

  • Debug.Write 호출은 릴리스에서 제거됩니다.
  • 릴리스에서는 Scott Hanselman이 설명한대로 최적화로 인해 CallStack이 약간 "이상하게"보일 수 있습니다.

디버그 및 릴리스는 다양한 솔루션 구성에 대한 레이블 일뿐입니다. 원하는 경우 다른 사용자를 추가 할 수 있습니다. 원하는 경우 구성 관리자에서 더 많은 구성을 추가 할 수 있습니다.

http://msdn.microsoft.com/en-us/library/kwybya3w.aspx

주요 차이점 –

1. 디버그 dll에는 Visual Studio의 모든 소스 코드 줄에 중단 점을 설정할 수 있도록 몇 가지 추가 지침이 추가되었습니다. 또한 코드를 디버깅 할 수 있도록 코드가 최적화되지 않습니다. 릴리스 버전에서는 이러한 추가 지침이 제거됩니다.

2. PDB 파일은 관련 모드가 아닌 디버그 모드에서만 생성됩니다.

3. 릴리스 모드에서 cpde는 JIT 컴파일러에 내장 된 최적화 프로그램에 의해 최적화됩니다. 다음과 같은 최적화를 수행합니다.

• 메서드 인라인-메서드 호출은 메서드의 코드를 삽입하는 것으로 대체됩니다.

• CPU 레지스터 할당-로컬 변수 및 메서드 인수는 스택 프레임에 다시 저장되지 않고 (또는 덜 자주) CPU 레지스터에 계속 저장 될 수 있습니다.

• 배열 인덱스 검사 제거-배열 작업시 중요한 최적화입니다 (모든 .NET 컬렉션 클래스는 내부적으로 배열을 사용합니다). JIT 컴파일러가 루프가 범위를 벗어난 배열을 인덱싱하지 않는지 확인할 수 있으면 인덱스 검사를 제거합니다.

•   Loop unrolling -  Short loops (up to 4) with small bodies are eliminated by repeating the code in the loop body. 

•   Dead code elimination - A statement like if (false) { /.../ } gets completely eliminated. 

•   Code hoisting- Code inside a loop that is not affected by the loop can be moved out of the loop.

•   Common sub-expression elimination. x = y + 4; z = y + 4; becomes z = x

ASP.NET Ajax 컨트롤 중 하나를 사용하는 경우 주요 성능 영역 중 하나는 릴리스에서 실행될 때 JavaScript 라이브러리에서 디버그 정보가 제거되고 복잡한 페이지에서 주요 성능 향상을 보았습니다. 다른 웹 기반 리소스는이 설정에 따라 캐시되거나 캐시되지 않을 수 있습니다.

또한 웹 애플리케이션의 디버그 / 릴리스는 web.configVisual Studio 내의 설정이 아니라 파일 에 의해 결정된다는 점을 기억 하십시오.

<system.web>
    <compilation debug="true">

추가 정보:


Drawing with GDI+ is considerably slower in Debug mode.


You can also manage some part of code that you want to run only in debug or only in release with preprocessor markups:

 #if DEBUG
    // Some code running only in debug
 #endif

or

 #if NOT DEBUG
    // Some code running only in release
 #endif

Release version:

  1. is considerable faster (most important), optimized

  2. can't be debuged (step by step)

  3. and code written in "debug" directive is not included

See What's the difference between a Debug vs Release Build?.


I got an error message when I distribute executable file to another machine indicating that the system missed MSVCP110D.dll.

The solution to this issue is stated in Stack Overflow question Visual Studio MSVCP110D.dll is missing.

IN XXXXD.dll D means that the DLL file is a debug version of the DLL file. But MS Visual C++ Redistributable packages include only the release version of DLL files.

That means if you need to distribute a program developed by Visual C++ you need to build it in Release mode. And also you need to install MS Visual C++ Redistributable (correct version) on the target machine.

So I think this a one of key difference between debug and release mode.

ReferenceURL : https://stackoverflow.com/questions/90871/debug-vs-release-in-net

반응형