2009-03-11 3 views
4

릴리스 버전에서 .pdb 파일이 생성되고 모든 줄을 밟을 수 있으면 중단 점 등을 넣은 다음 왜 내 구성 요소의 "디버그"버전을 빌드해야합니까?C# - 실제로 디버그 빌드가 필요합니까?

내 프로젝트에 C#을 사용하고 있으며 릴리스 버전을 디버깅하는 데 문제가 없었습니다. C++에서는 최적화 된 코드를 디버깅하는 데 문제가 있었지만 C#에서는 문제가 없었습니다. 나는 바보 같은 코드 블록에 대해 말하지 않고있다. if(false) ...

답변

7

하나의 이유는 첨부 대 출시입니다.

.Net에서 소매 프로세스를 시작하면 디버깅 프로세스가 시작될 때와 거의 비슷합니다. 디버깅 경험에 어떤 차이가 있는지 알지 못할 것입니다.

첨부는 ​​완전히 다른 볼 게임입니다. C# 및 VB는 모두 소매점 빌드에/optimize + 플래그를 전달합니다. 그러면 DebuggingMode.DisableOptimizations 플래그없이 어셈블리 수준에서 DebuggableAttribute이 포함됩니다. 프로세스 실행 중에 VS/CLR은 본질적으로이 사실을 무시하고 디버깅에 영향을주는 JIT 최적화를 사용하지 않도록 통신합니다. 첨부하는 동안 이러한 항목이 발생하지 않으며 JIT/CLR은 마음 콘텐츠에 최적화됩니다. 나는 당신을 보장한다, 디버깅 경험은이 경우에 훨씬 나쁘다.

당신은

  • 프로세스에 연결없이 디버깅 시작
  • CTRL + F5를 릴리스 스위치 빌드
    • VS

      이 실험 할 수 있습니다. (C#을)에서
  • +0

    Retail보다는 Release를 의미합니까? – Matt

    +0

    @Matt, 예, VS는 릴리스 – JaredPar

    8

    릴리즈 빌드가 더 최적화되어있다. 릴리스 빌드를 디버깅 할 때 런타임에서 값을 사용하지 않을 때 로컬 변수의 값이 사라지는 것을 나에게 귀찮게합니다.

    5

    그러나 디버그 빌드도 조금씩 것을 보장하기 위해 GC의 동작을 변경

    0

    릴리스 디버그 빌드보다 추가 최적화를 수행 빌드 .. 당신이 &이 릴리스 빌드를 계속 편집 할 수 없습니다 윈폼 디버그 세션 중일 때 당신의 아래에서 수집 된 객체를 얻지 마십시오. 디버그 빌드는 JIT 중에 디버깅 세션에 부정적인 영향을 줄 수있는 특정 최적화를 방지합니다.

    +0

    을 사용합니다.이 기능은 JIT 컴파일러가 아닌 GC 기능입니까? –

    2

    몇 가지 이유가 있습니다 : 기본적으로

    • , 릴리스 빌드는 PDB 파일에 많은 디버깅 정보를 포함하지 않습니다. 나는이 옵션이 더 두드러지게 사용되었다고 생각한다. Output의 "Advanced settings"에 "none", "full"(디버그 빌드의 기본값) 및 "pdb-only"(기본값은 release 빌드).
    • 기본적으로 릴리스 빌드가 최적화되어 있습니다. 대부분의 작업을 수행하는 JIT로 인해 다른 언어 (예 : C++)와 거의 차이가 없지만 일부는 차이가 있습니다 릴리스 빌드를 디버그하는 것이 더 어려워집니다.
    • 기본적으로 릴리스 빌드는 DEBUG 기호를 정의하지 않으므로 Debug.Assert 등의 호출은 제거됩니다.

    많은 빌드 구성에서 변경할 수 있습니다.가장 일반적인 접근법 중 하나는 을 제외하고 디버그 정보를 릴리스 빌드에 추가하는 것입니다. 더 유용한 스택 추적을 제공 할 수 있습니다. 을 수행하면에서 디버거를 사용합니다. 캐치되지 않는 예외가 발생했을 때

    +0

    나는 첫 번째 점에서 당신이 틀렸다고 생각한다. PDB는 릴리스 빌드에 대한 VS의 기본 구성 (콘솔 앱으로 확인 됨)에 포함됩니다. 디버깅 중에 다른 방법으로 지역 정보를 제공하는 것은 불가능합니다. – JaredPar

    +0

    오오 ... 지금 확인하십시오. –

    +0

    음 ... 이상합니다. 나는 그 아이디어를 어디에서 얻었는지 궁금해. 편집 중. –

    3

    이 외에도 다른 답변에서, 나는 동작을 변경하기 위해 자동으로 #define DEBUG 생성을 사용

    • 릴리스 모드에서 실행, 사용자에게 좋은 메시지를 표시하고 선택적으로 오류를 기록하는 경우, 디버그 모드에서 실행되는 경우
    • 은 (디버거 중단의 원인이됩니다) 아무것도 나는 Lennaert에 동의
    0

    을하지 않는다 - 나는 빌드 사이에 처리 다른 오류를 수행하는 경향이있다. 예를 들어 일부 앱의 경우 디버그 빌드에서 슈퍼 아날입니다. 사전 및 사후 조건, 어설 션, 예외 등. 기본적으로 개발자가 내 라이브러리를 올바르게 사용하도록하고 있습니다. 반면 릴리스 빌드에서는 성능을 향상시키기위한 조건을 완화합니다.

    0

    당신이 계약에 의해 디자인을 사용하는 경우, 두 개의 빌드하는 것이 중요합니다 - 전제 조건을 확인하지 않습니다 릴리스 한, 사후클래스 불변하고이를 확인 디버그 일 (통해 어설 션).

    일부 상황에서는 사전 조건 확인이 릴리스 모드 (관련 질문 검색)에서 활성 상태로 유지 될 수 있지만 전체 스토리가 변경되지는 않습니다.

    개발 단계에서는 모든 계약 가정을 확인하고 해제 할 때 더 이상 확인하지 않습니다. 코드를 테스트 한 결과 작동한다는 것을 알고 있으므로 은 이전 가정에서에 의존합니다. - 그것이 처음부터 의도 된 이유입니다.