왜 .pdb 파일 생성을 해제합니까?


264

.pdb릴리스에서 컴파일 할 때 Visual Studio 2005가 파일을 생성하는 이유는 무엇 입니까? 릴리스 빌드를 디버깅하지 않으므로 왜 생성됩니까?


18
왜 실시간으로 pdb를 생성합니까? 따라서 충돌 보고서가 야생에서 나올 때이를 디버깅 할 정보가 있습니다. 다른 가치는 고객이 원작자가하지 않을 때 고객이 디버깅 할 수 있다는 것입니다.
Ian Boyd

@IanBoyd :이 의견의 두 번째 문장은 PDB를 배포한다는 의미입니다. 대부분의 경우 바람직하지 않습니다.
IInspectable

3
@IInspectable 또는 바람직하다
Ian Boyd

@IanBoyd : 대부분의 경우에는 OS 배포가 포함되지 않습니다. 또한 이러한 PDB에는 PDB를 생성 할 때 기본적으로 포함되는 개인 기호가 포함되어 있지 않습니다.
IInspectable 2016 년

PBD를 해제하는 한편 @IInspectable 것이 바람직. 이상적으로는 모든 사람들이 IL로 컴파일 된 코드를 작성하여 심볼 정보를 직접 얻을 수 있습니다. 그러나 네이티브 코드 컴파일러는 여전히 현장에서 디버깅을 지원하는 쉬운 방법이 없습니다.
Ian Boyd

답변:


416

PDB 파일이 없으면 주소 수준 디버깅 이외의 다른 방법으로 "릴리스"빌드를 디버깅 할 수 없습니다. 최적화는 실제로 코드에서 숫자를 수행하므로 문제가 발생하면 (예 : 예외 발생) 범인을 찾기가 매우 어렵습니다. 소스 코드 행을 생성 된 어셈블리 코드와 일대일로 (또는 동일한 순서로) 일치시킬 수 없기 때문에 중단 점 설정조차 매우 어렵습니다. PDB 파일은 사후 디버깅을 훨씬 쉽게 만들어 사용자와 디버거를 도와줍니다.

소프트웨어를 출시 할 준비가 되었으면 그때까지 모든 디버깅을 수행했음을 지적합니다. 확실히 사실이지만 명심해야 할 몇 가지 중요한 사항이 있습니다.

  1. 당신은해야 또한 테스트하고 "릴리스"빌드를 사용하여 응용 프로그램을 (당신이 그것을 해제하기 전에) 디버깅합니다. 최적화를 켜면 (디버그 구성에서 기본적으로 비활성화되어 있음) 때로는 잡을 수없는 미묘한 버그가 나타날 수 있기 때문입니다. 이 디버깅을 수행 할 때 PDB 기호가 필요합니다.

  2. 고객은 종종 "이상적인"조건에서만 자라는 최첨단 사례 및 버그를보고합니다. 이것들은 실험실에서 재현하기가 거의 불가능한데, 그 이유는 사용자 컴퓨터의 일부 구성에 의존하기 때문입니다. 고객이 특히 도움이되는 경우, 발생한 예외를보고하고 스택 추적을 제공합니다. 또는 컴퓨터를 빌려서 소프트웨어를 원격으로 디버깅 할 수도 있습니다. 두 경우 모두 PDB 파일이 도움이 될 것입니다.

  3. 프로파일 링은 항상 최적화가 활성화 된 "릴리스"빌드에서 수행 해야합니다 . 그리고 다시 한 번, PDB 파일은 프로파일 링중인 어셈블리 명령어를 실제로 작성한 소스 코드에 다시 매핑 할 수 있기 때문에 편리합니다.

컴파일 되돌아 와서 PDB 파일 생성 할 수 없습니다 . * 빌드 중에 생성하지 않으면 기회를 잃어버린 것입니다. 그것들을 만들기 위해 아무것도 아프지 않습니다. 배포하지 않으려면 바이너리에서 간단히 생략하면됩니다. 그러나 나중에 원하는 것을 결정하면 운이 나빠집니다. 필요할 때를 대비하여 항상 생성하고 사본을 보관하는 것이 좋습니다.

당신이 정말로 그들을 끄고 싶다면, 그것은 항상 옵션입니다. 프로젝트의 속성 창에서 변경하려는 구성에 대해 "디버그 정보"옵션을 "없음"으로 설정하십시오.

그러나 "디버그"및 "릴리스"구성 기본적으로 디버그 정보를 생성하기 위해 다른 설정을 사용합니다. 이 설정을 유지하고 싶을 것입니다. 디버그 빌드의 경우 "디버그 정보"옵션이 "전체"로 설정됩니다. 즉, PDB 파일 외에도 디버깅 심볼 정보가 어셈블리에 포함됩니다. 편집 및 계속과 같은 멋진 기능을 지원하는 심볼도 있습니다. 릴리스 모드에서는 "pdb-only"옵션이 선택되는데, 소리와 마찬가지로 어셈블리의 내용에 영향을주지 않고 PDB 파일 만 포함합니다. 따라서 /bin디렉토리 에 PDB 파일의 존재 유무만큼 간단하지 않습니다 . 그러나 "pdb-only"옵션을 사용한다고 가정하면 PDB 파일은

*마크 셔먼이 코멘트에 지적 소스 코드가 변경되지 않은 (또는 버전 관리 시스템에서 원본 코드를 검색 할 수 있습니다)만큼, 당신은 그것을 다시와 일치하는 PDB 파일을 생성 할 수 있습니다. 적어도 보통은 이것은 대부분 잘 작동하지만 컴파일러는 동일한 코드를 컴파일 할 때마다 동일한 바이너리를 생성한다고 보장하지 않으므로 미묘한 차이 가있을 있습니다. 최악의 경우 (Visual Studio 용 서비스 팩 적용과 같이) 툴체인을 업그레이드 한 경우 PDB가 일치 할 가능성이 훨씬 줄어 듭니다. 출고 후 신뢰할 수있는 생성 보장PDB 파일을 사용하려면 빌드 환경의 구성을 정확하게 다시 만들 수 있도록 버전 제어 시스템의 소스 코드뿐만 아니라 전체 빌드 툴체인의 바이너리도 보관해야합니다. PDB 파일을 간단히 생성하고 보관하는 것이 훨씬 쉽다는 것은 말할 나위도 없습니다.


19
"컴파일 후에는 PDB 파일을 생성 할 수 없습니다." -소스 코드가 변경되지 않은 경우 사실 후에 사용 가능한 PDB를 생성하도록 다시 빌드 할 수 있습니다. 기본적으로 windbg는이 PDB를로드하지 않지만 / i 옵션을 이와 같이 지정하여 강제로로드 할 수 있습니다 .reload /i foo.dll. foo.dll을 해제 한 후 foo.pdb가 생성 된 경우에도 foo.pdb를로드합니다.
Marc Sherman

새 컴파일마다 해시 다이제스트마다 다른 것으로 나타 났으므로 동일한 환경에서도 각 빌드마다 약간의 차이가 있습니다. PDB의 주소가 분산에 따라 변경되지 않으므로 PDB를 해당 빌드에서 유지해야합니까? PDB가 어떻게 작동하는지 또는 해시가 빌드간에 변경되는 이유를 실제로 이해하지 못하기 때문에 이것을 아이디어로 제시하십시오.
thebunnyrules

1
@the 각주에서, 나는 연결 기사 있음을 설명 디자인으로 C # 컴파일러는 결코 두 번 같은 바이너리를 생성하지 않습니다. "C # 컴파일러가 모든 어셈블리에 갓 생성 된 GUID를 내장, 당신이 그것을 실행할 때마다, 그에 보장없이 두 어셈블리가 "비트마다 동일합니다." 그것은 왜 다른 해시와 다른 PDB 파일을 가지고 있는지 설명합니다. 16 진 편집기로 수정할 수 있지만 사용자에게 친숙하지는 않습니다. 또한이 답변의 범위를 벗어납니다.
코디 그레이

3
Roslyn에는 결정적 빌드라는 새로운 기능이 있습니다. "/ deterministic 플래그는 동일한 입력이 주어질 때 컴파일러가 바이트 단위로 정확히 동일한 EXE / DLL을 방출하도록합니다." 이것이 의미하는 것은이 플래그로 오리지널 컴파일 된 프로젝트이며, 컴파일하는 코드가 동일한 한 정확히 동일한 바이너리로 다시 컴파일 할 수 있습니다. 에서 찾을 수 있습니다 더 긴 설명 결정적는 로슬린 빌드
K 스미스에게

92

를 위해 Release뿐만 아니라 PDB를 생성 할 수 있습니다 Debug. 이것은 VS2010에서 설정되었지만 VS2005에서는 유사해야합니다.

프로젝트 → 속성 → 빌드 → 고급 → 디버그 정보

로 변경하십시오 None.


2
그러나 왜 그렇게하겠습니까? 소프트웨어가 출시 될 준비가되면 그때까지 모든 디버깅을 완료해야합니다.
m.edmondson

4
생산 문제를 디버깅 할 수 있기 때문입니다. 일단 우리는 그것을해야했다.
Aliostad

21
프로덕션 코드에 대한 PDB 제목의 장점은 .NET이 예외를 던질 때 이러한 파일을 사용한다는 것입니다. 파일 이름과 줄 번호로 스택 추적을 생성하는데, 이는 종종 매우 편리합니다!
Steven

6
@ m.edmondson : 예, 맞습니다. throw 된 예외 무엇인지 (예 :) 계속 알려 FileNotFoundException주지만 스택 추적을 볼 수는 없습니다. 따라서 어떤 코드 이 예외를 발생 시켰는지 정확히 찾아내는 것이 매우 어렵습니다 .
코디 그레이

2
@ m.edmondson 프로덕션 상자의 문제 중 하나를 원격으로 디버깅하는 도구를 찾고 있다면 Windows SDK에는 원격 디버깅을 지원하는 WinDbg라는 매우 유명한 도구가 있습니다. 아래 언급 된 링크를보십시오. 도움이 되었기를 바랍니다! msdn.microsoft.com/en-in/library/windows/hardware/…
RBT

8

.pdb 파일이 없으면 프로덕션 코드를 단계별로 실행하는 것이 사실상 불가능합니다. 많은 비용과 시간이 소요될 수있는 다른 도구를 사용해야합니다. 예를 들어 추적 또는 windbg를 사용할 수 있지만 실제로 달성하려는 대상에 따라 다릅니다. 특정 시나리오에서는 특정 동작을 관찰하기 위해 프로덕션 데이터를 사용하여 원격 코드 (오류 또는 예외 없음)를 단계별로 실행하려고하는데,이 위치에서 .pdb 파일이 편리합니다. 그들 없이는 해당 코드에서 디버거를 실행할 수 없습니다.


7

릴리스 빌드를 디버그하지 않는 이유가 무엇입니까? 간혹 (아주 드물지만 발생) 고객이 디버그 버전에서 재현 할 수없는 결함 보고서 (다른 타이밍, 작은 다른 동작 등)가 발생할 수 있습니다. 릴리스 빌드에서 해당 문제를 재현 할 수있는 것으로 보이면 pdb와 일치하게되어 기쁩니다.


5
@ m.edmondson RDP, Webex 등을 사용하여 원격 시스템에 액세스하고 거기에 windbg를 설치하십시오. 당신의 기호 경로와 bam을 설정, 당신은 황금입니다!
Marc Sherman

더 자세한 가이드 링크가 더 도움이되었을 것입니다. 이 단선 방법은 (나 같은) 사람들을 잘못된 길로 인도 할 수 있습니다. 예를 들어 대부분의 .NET 개발자는 Windbg에 대해 전혀 알지 못합니다.
nuzzolilo

1
@ m.edmondson-일부 Visual Studio 에디션에는 원격 디버깅을 수행 할 수있는 기능이 있습니다. 디버그 메뉴에서 원격 시스템의 "처리하도록 연결"합니다.
Matthew

프로덕션 응용 프로그램 인스턴스를 원격으로 디버깅하는 것이 좋은 생각입니까? 스레드의 병렬 실행을 중단하고 디버깅하는 동안 강제로 직렬로 실행하지 않습니까?
Kaveh Hadjari

4

또한 크래시 덤프를 사용하여 소프트웨어를 디버깅 할 수 있습니다. 고객은 고객에게이를 전송 한 다음이를 사용하여 소스의 정확한 버전을 식별 할 수 있으며 Visual Studio는 크래시 덤프를 사용하여 올바른 디버깅 심볼 세트 (및 올바르게 설정 한 경우 소스)를 가져옵니다. Symbol Stores에 대한 Microsoft 설명서를 참조하십시오 .


2

.PDB 파일은 "Program Database"의 짧은 이름입니다. 디버거의 디버그 지점 및 사용되거나 참조되는 리소스에 대한 정보가 들어 있습니다. 디버그 모드로 빌드 할 때 생성됩니다. 런타임에 응용 프로그램을 디버깅 할 수 있습니다.

크기는 디버그 모드에서 .PDB 파일의 크기입니다. 애플리케이션을 테스트 할 때 사용됩니다.

pdb 파일의 좋은 기사.

http://www.codeproject.com/Articles/37456/How-To-Inspect-the-Content-of-a-Program-Database-P


1
누군가 릴리스 된 버전에서 충돌이 발생하고 사용자가 가져온 충돌 보고서에 사용 가능한 스택 추적이 포함되어 있지 않은 경우를 제외하고는 "릴리스 또는 배포시이 파일이 필요하지 않습니다". 모두.
Nyerguds 2012 년

사실이 아니다. .pdb 파일이 없으면 전체 스택 추적을 얻을 수 있지만 소스 파일 이름은 없습니다. 충돌 보고서를받은 후 사내에서 복구 할 수 있습니다. 지적 재산권에 관심이 있고 소스를 난독 처리하려면 .pdb 파일을 저장해야하지만 배포하지 않아야합니다.
TOP KEK

1

다중 프로젝트 솔루션에서는 일반적으로 PDB 또는 XML 파일을 전혀 생성하지 않는 하나의 구성이 필요합니다. Debug Info모든 프로젝트 의 속성을 로 변경하는 대신 none특정 구성에서만 작동하는 빌드 후 이벤트를 추가하는 것이 더 편리하다고 생각했습니다.

불행히도 Visual Studio에서는 다른 구성에 대해 다른 빌드 후 이벤트를 지정할 수 없습니다. 따라서 csproj시작 프로젝트 파일을 편집하고 기존 PostBuildEvent태그 대신 다음을 추가하여 수동 으로이 작업을 수행하기로 결정했습니다 .

  <PropertyGroup Condition="'$(Configuration)' == 'Publish'">
    <PostBuildEvent>
        del *.pdb
        del *.xml
    </PostBuildEvent>
  </PropertyGroup>

불행히도, 이것은 빌드 후 이벤트 텍스트 상자를 비워두고 그 안에 아무것도 넣지 않으면 예기치 않은 결과가 발생할 수 있습니다.


4
모든 *.xml파일 이 삭제 되므로주의하십시오.
Mariusz Jamro

0

디버그 기호 ( .pdb) 및 XML doc ( .xml) 파일은 전체 크기의 큰 비율을 구성하며 일반 배포 패키지의 일부가되어서는 안됩니다. 그러나 필요한 경우 액세스 할 수 있어야합니다.

한 가지 가능한 접근 방식 : TFS 빌드 프로세스가 끝나면 별도의 아티팩트로 이동하십시오.


-1

실제로 PDB 파일과 기호 정보가 없으면 성공적인 충돌 보고서 (메모리 덤프 파일)를 만들 수 없으며 Microsoft는 문제의 원인을 완전히 파악할 수 없습니다.

따라서 PDB를 사용하면 충돌보고 기능이 향상됩니다.


그러나 .pdb 파일이 없으면 정확히 무엇을 놓을 수 있습니까?
TOP KEK

컴파일 후에는 PDB 파일을 생성 할 수 없습니다. 따라서 발생한 모든 문제를 제대로 이해하려면 소프트웨어 major.minor [.build [.revision]]의 모든 버전을 Microsoft에 저장해야합니다. 그러나 이것이 전부는 아닙니다.
prosti

컴파일러는 동일한 코드를 컴파일 할 때마다 동일한 바이너리를 생성한다고 보장하지 않습니다.
prosti

문제는 충돌 보고서에서 무엇이 누락되고 충돌보고가 어떻게 영향을 받는지였습니다. .NET pdb 파일에는 개인 변수 이름과 소스 파일 이름 만 포함됩니다. 다른 모든 방법 (메서드 이름, 서명 등)은 메타 데이터 정보의 스택 추적에 있습니다.
TOP KEK

PDB 파일에는 개인 정보가 아닌 github.com/microsoft/microsoft-pdb 도 포함되어 있지 않습니다 .
prosti
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.