IT박스

디버그 정보를 사용하여 릴리스 빌드를 "full"또는 "pdb-only"로 컴파일해야합니까?

itboxs 2020. 8. 4. 07:39
반응형

디버그 정보를 사용하여 릴리스 빌드를 "full"또는 "pdb-only"로 컴파일해야합니까?


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

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


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

full대신에 함께 사용 pdb-only하면 실행 파일을 디버거에 직접 연결할 수 있다는 점을 제외하고 동일한 이점을 얻을 수 있습니다. 귀하의 제품 및 고객에게 이것이 합리적인지 결정해야합니다.

충돌 보고서가 들어올 때 참조 할 수 있도록 PDB 파일을 어딘가에 저장하십시오. 심볼 서버설정하여 디버깅 심볼을 저장하는 것이 훨씬 좋습니다.

로 빌드하기로 선택 none하면 필드에 충돌이있을 때 상환권이 없습니다. 충돌에 대한 모든 종류의 사후 검사를 수행 할 수 없으므로 문제를 추적하는 기능이 심각하게 방해 될 수 있습니다.

성능에 대한 참고 사항 :

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


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

당신은 / 디버그를 사용하는 경우 : 전체를 : 속도와 JIT 최적화 된 코드의 크기와 / 디버그 코드 품질에 작은 영향에 약간의 영향이 있음을 알고 있어야 전체가 . 릴리스 코드 생성을 위해 / debug : pdbonly 또는 PDB 없음을 권장 합니다.

/ debug : pdbonly 와 / debug : full의 한 가지 차이점은 / debug : full을 사용하여 컴파일러 에서을DebuggableAttribute 생성한다는 점입니다.이 정보는 JIT 컴파일러에게 디버그 정보를 사용할 수 있음을 알리는 데 사용됩니다.

그렇다면 지금은 무엇입니까?

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

그것들이 정확히 동일하다면 왜 우리는 이러한 옵션을 가질 수 있습니까? John Robbins (Windows 디버깅 신) 이러한 이유로 역사적인 이유가 있음을 발견했습니다 .

.NET 1.0으로 돌아 가면 차이점이 있었지만 .NET 2.0에서는 그렇지 않았습니다. .NET 4.0이 동일한 패턴을 따르는 것처럼 보입니다. CLR 디버깅 팀과 다시 확인한 후에는 아무런 차이가 없습니다.

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

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

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

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

즉, DebugInfo 설정 pdb-only 또는 full에 관계없이 동일한 결과가 나타납니다. 릴리스 된 제품의 크래시 덤프를 분석하거나 디버거를 연결할 수 없기 때문에 None 을 피하는 것이 좋습니다 .


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

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


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

.pdb를 배포하지 않으면 pdb 전용 빌드로도 스택 추적에 줄 번호가 없습니다.

그래서 VB 앱의 exe와 함께 pdb를 배포 (LAN에 XCOPY 배포)하고 있습니다.

참고 URL : https://stackoverflow.com/questions/7713514/should-i-compile-release-builds-with-debug-info-as-full-or-pdb-only

반응형