디버그 정보가 "전체"또는 "pdb 전용"인 릴리스 빌드를 컴파일해야합니까?


114

C # 프로젝트 용 Visual Studio 2010에서 프로젝트 속성> 빌드> 고급> 디버그 정보로 이동하면 없음, 전체 또는 pdb 전용의 세 가지 옵션이 있습니다. 이 질문 에 대한 답변을 바탕으로 전체 및 pdb 전용의 차이점을 이해한다고 생각합니다. 그러나 릴리스 빌드에 더 적합한 것은 무엇입니까? "전체"를 사용하면 성능에 영향이 있습니까? "pdb 전용"을 사용하면 프로덕션 문제를 디버깅하기가 더 어렵습니까?

"full"과 "pdbonly"의 차이점은 무엇입니까? https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/debug-compiler-option


릴리스 빌드의 경우 항상 pdb 전용 또는 없음입니다.
leppie

13
@leppie 감사하지만 그 입장에 대한 정당성을 찾고 있습니다.
RationalGeek


성능에 영향을 미치지 않으면 좋습니다. 메모리 영향은 어떻습니까? StackTrace의 인스턴스를 만들고 파일 정보를 요청하면 pdb 심볼 데이터에서 가져와야합니다. 응용 프로그램 시작시 모든 기호가 메모리에로드됩니까? 이것의 대략적인 메모리 사용은 무엇입니까? (예 : 코드 크기 대비 오버 헤드 비율)
yoyo

답변:


90

나는 pdb-only. 출시 된 제품에 디버거를 연결할 수 없지만 크래시 덤프가 발생하면 Visual Studio 또는 WinDBG 를 사용하여 크래시 발생시 스택 추적 및 메모리 덤프를 검사 할 수 있습니다 .

당신이가는 경우 full가 아니라 pdb-only, 당신은 실행 파일이 디버거에 직접 부착 될 수 있다는 것을 제외하고는 동일한 혜택을받을 수 있습니다. 제품 및 고객을 고려할 때 이것이 합리적인지 판단해야합니다.

충돌 보고서가 올 때 참조 할 수 있도록 PDB 파일을 어딘가에 저장해야합니다. 이러한 디버깅 기호를 저장 하도록 기호 서버 를 설정할 수 있다면 훨씬 좋습니다.

를 사용하여 빌드하기로 선택 none하면 현장에서 충돌이 발생했을 때 의지 할 수 없습니다. 충돌에 대한 사후 조사를 수행 할 수 없으므로 문제를 추적하는 능력이 심각하게 저하 될 수 있습니다.

성능에 대한 참고 사항 :

모두 존 로빈스에릭 Lippert의는 [정보] 블로그 게시물을 작성했습니다 /debug플래그, 그들은 모두 나타냅니다 이 설정이 제로 성능에 미치는 영향을 . /optimize컴파일러가 최적화를 수행해야하는지 여부를 나타내는 별도의 플래그가 있습니다.


7
@Matt, / debug 스위치에 대한 MSDN 기사 는 'full'설정 사용의 성능 영향에 대해 명시 적으로 경고합니다.If you use /debug:full, be aware that there is some impact on the speed and size of JIT optimized code and a small impact on code quality with /debug:full. We recommend /debug:pdbonly or no PDB for generating release code.
Allon Guralnek

3
@Matt : 'full'이 'pdb-only'에 비해 단점이 없지만 장점 만 있다면 왜 'pdb-only'가 존재합니까? '전체'보다 사용하는 이유가 있습니까? 또한 '커뮤니티 콘텐츠'섹션의 MSDN 문서에 수정 사항을 추가해야합니다.
Allon Guralnek 2012

9
링크 된 John Robbins 기사에서 @AllonGuralnek 인용 : 진짜 이유 : 역사. .NET 1.0에서는 차이가 있었지만 .NET 2.0에서는 차이가 없었습니다. .NET 4.0이 동일한 패턴을 따르는 것 같습니다. CLR 디버깅 팀과 다시 한 번 확인한 후에는 전혀 차이가 없습니다.
bentayloruk

5
이것은 사실이 아닙니다. pdb 전용으로 빌드하고 디버거를 계속 연결할 수 있습니다. 그냥 확실하게 했어요.
Mark

2
"pdb 전용으로 빌드 할 것입니다. 출시 된 제품에 디버거를 연결할 수 없습니다."여기서 정보 소스는 무엇입니까? @Mark와 내가 언급했듯이 이것은 정확하지 않은 것 같습니다.
MEMark 2015

66

경고 / debug 스위치에 대한 MSDN 설명서 (Visual Studio에서는 디버그 정보 임)가 오래된 것 같습니다! 이것은 잘못된 것입니다.

/ debug : full 을 사용 하는 경우 JIT 최적화 코드의 속도와 크기에 약간의 영향을 미치고 / debug : full을 사용하면 코드 품질에 약간의 영향이 있음을 유의하십시오 . 릴리스 코드 생성을 위해 / debug : pdbonly 또는 PDB 없음을 권장 합니다.

/ debug : pdbonly 와 / debug : full의 한 가지 차이점은 / debug : full을 사용하면 컴파일러가를 내보내고 DebuggableAttributeJIT 컴파일러에 디버그 정보를 사용할 수 있음을 알리는 데 사용된다는 것입니다.

그렇다면 이제 무엇이 사실입니까?

  1. Pdb 전용 – .NET 2.0 이전에는 출시 된 제품 (고객 컴퓨터)의 크래시 덤프를 조사하는 데 도움이되었습니다. 그러나 디버거를 연결할 수 없었습니다. .NET 2.0에서는 그렇지 않습니다. 그것은는 정확히 같은 전체 .
  2. Full – 크래시 덤프를 조사하는 데 도움이되며 릴리스 빌드에 디버거를 연결할 수도 있습니다. 그러나 MSDN에서 언급 한 것과 달리 .NET 2.0부터는 성능에 영향을주지 않습니다. Pdb-only 와 정확히 동일 합니다 .

정확히 동일하다면 왜 이러한 옵션이 있습니까? John Robbins (윈도우 디버깅 신) 는 역사적 이유 때문에 이것들이 있다는 것을 알아 냈습니다 .

.NET 1.0에서는 차이가 있었지만 .NET 2.0에서는 그렇지 않습니다. .NET 4.0이 동일한 패턴을 따르는 것 같습니다. CLR 디버깅 팀과 다시 한 번 확인한 후에는 전혀 차이가 없습니다.

JITter가 디버그 빌드를 수행하는지 여부를 제어하는 ​​것은 / optimize 스위치입니다. <…>

결론은 / optimize + 및 / debug 스위치를 사용하여 릴리스 빌드를 빌드하여 소스 코드로 디버깅 할 수 있도록한다는 것입니다.

그런 다음 그는 그것을 증명하기 위해 계속합니다.

이제 최적화는 별도의 스위치의 일부입니다 /optimize(Visual Studio에서는라고 함 Optimize code).

간단히 말해, DebugInfo 설정 pdb-only 또는 full에 관계없이 동일한 결과를 얻을 수 있습니다. 권장 사항은 출시 된 제품에서 크래시 덤프를 분석하거나 디버거를 연결하지 못하므로 None 을 피하는 것입니다.


3
환상적인 대답! 내 조사 (생성 된 파일 비교)에서 동일한 결과를 보여줍니다.
MEMark 2015

@rpattabi pdbonly와 full이 동일한 참조를 지정할 수 있습니까? 2019 년이고 문서는 여전히 다르며 전체 성능 저하가 있음을 나타냅니다. 그리고 VS2019 Release는 기본적 으로 구성의 디버그 유형이 pdbonly.

@joe MSDN 설명서 msdn.microsoft.com/en-us/library/8cw0bt21.aspx 하단에 토론이 있습니다 . 한번보세요. 한 기고자는 pdbonly와 full이 동일하게 언급되는 최신 정보 를 얻기 위해 github.com/dotnet/roslyn/blob/master/docs/compilers/CSharp/… 를 가리 습니다. (참고로 저는 더 이상 windows 나 VS를 사용하지 않습니다. 그래서 그곳에서 무슨 일이 일어나고 있는지
추적

16

PDB 만 필요하지만 사용자에게 PDB 파일을 제공하고 싶지는 않습니다. 그러나 바이너리와 함께 직접 사용하면 WinDbg와 같은 디버거에 크래시 덤프를로드하고 프로그램이 실제로 실패한 위치를 확인할 수 있습니다. 액세스 권한이없는 시스템에서 코드가 충돌 할 때 유용 할 수 있습니다.

전체 디버그는 코드에 [Debuggable] 속성을 추가합니다. 이것은 속도에 큰 영향을 미칩니다. 예를 들어, 단일 단계를보다 쉽게 ​​수행하기 위해 일부 루프 최적화를 비활성화 할 수 있습니다. 또한 추적 기능을 사용하므로 JIT 프로세스에 약간의 영향을 미칩니다.


말이된다. 어쨌든 사용자에게 DLL을 배포하지는 않습니다. 이것은 ASP.NET 앱입니다. 하지만 대답을 향상시키고 "pdb 전용"과 "전체"를 사용해야 하는 이유 를 정당화 할 수 있습니까? 성능 문제입니까?
RationalGeek

@jkohlhepp : JIT로 인해 일부 정보를 잃을 수 있기 때문에 릴리스 빌드 디버깅이 약간 까다 롭지 만 추가하고 싶습니다. 거의 항상 메서드 인수의 값을 볼 수 없습니다. 이 문제를 해결하려면, 당신은 일시적으로 비활성화 JIT 최적화를 사용 할 수 있습니다 .
Ilian Pinzon

blowdart에게 감사하고 추가 정보에 대해 Ilian Pinzon에게 감사드립니다. 릴리스 코드로 완벽한 디버깅을 할 수는 없지만 PDB를 갖는 것이없는 것보다 낫다는 것을 알고 있습니다.
RationalGeek

"전체"설정을 사용해도 성능에 영향을 주지 않습니다 . 디버거를 실행중인 프로세스에 연결할 수 있습니다.
Matt Dillard 2012

1
MSDN Matt에 대한 좋은 질문, msdn.microsoft.com/en-us/library/8cw0bt21 , 직접 답변을 기다리고 있습니다.
Luke Hutton

4

처리되지 않은 예외 처리기를 작성하는 중이며 pdb-only를 사용할 때 스택 추적에 줄 번호가 포함됩니다. 그렇지 않으면 없음을 선택하면 하위 / 함수 이름이 표시됩니다.

.pdb를 배포하지 않으면 pdb 전용 빌드를 사용해도 스택 추적에서 줄 번호를 얻지 못합니다.

그래서 저는 VB 앱의 exe와 함께 pdb를 배포합니다 (LAN에 XCOPY 배포).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.