디버깅하는 동안 PDB를 통해 무엇을 얻을 수 있으며 PDB가 작동하는지 어떻게 알 수 있나요?

StackOverflow https://stackoverflow.com/questions/52600

  •  09-06-2019
  •  | 
  •  

문제

소스 코드 없이 타사 구성 요소를 사용해야 합니다.릴리스 DLL과 릴리스 PDB 파일이 있습니다.이를 'CorporateComponent.dll'이라고 부르겠습니다.내 코드는 이 DLL에서 개체를 만들고 이러한 개체에 대한 메서드를 호출합니다.

CorpObject o = new CorpObject();
Int32 result = o.DoSomethingLousy();

디버깅하는 동안 'DoSomethingLousy' 메서드에서 예외가 발생합니다.PDB 파일은 나에게 어떤 역할을 합니까?그것이 좋은 일을 한다면 내가 그것을 활용하고 있는지 어떻게 확신할 수 있습니까?

도움이 되었습니까?

해결책

제공된 PDB인 CorporateComponent.pdb를 사용하고 있는지 확인하려면 Visual Studio IDE 내에서 디버깅하는 동안 출력 창을 검토하고 CorporateComponent.dll이 로드되었음을 나타내는 줄을 찾은 다음 뒤에 문자열이 옵니다. Symbols loaded.

내 프로젝트에서 설명하자면:

The thread 0x6a0 has exited with code 0 (0x0).
The thread 0x1f78 has exited with code 0 (0x0).
'AvayaConfigurationService.vshost.exe' (Managed): Loaded 'C:\Development\Src\trunk\ntity\AvayaConfigurationService\AvayaConfigurationService\bin\Debug  \AvayaConfigurationService.exe', Symbols loaded.
'AvayaConfigurationService.vshost.exe' (Managed): Loaded 'C:\Development\Src\trunk\ntity\AvayaConfigurationService\AvayaConfigurationService\bin\Debug\IPOConfigService.dll', No symbols loaded.

Loaded 'C:\Development\src...\bin\Debug\AvayaConfigurationService.exe', Symbols loaded.

이는 IDE 디버거가 PDB를 찾아서 로드했음을 나타냅니다.

다른 사람들이 지적한 대로 응용 프로그램 내에서 스택 프레임을 검사할 때 CorporateComponent.pdb에서 기호를 볼 수 있어야 합니다.그렇지 않다면 아마도 타사가 릴리스 PDB 빌드에 기호 정보를 포함하지 않았을 것입니다.

다른 팁

pdb에는 디버거가 스택을 올바르게 읽는 데 필요한 정보가 포함되어 있습니다.스택 추적에는 pdb가 있는 모듈 내부 스택 프레임의 줄 번호와 기호 이름이 포함됩니다.

두 가지 사용 예를 들어보겠습니다.첫 번째는 분명한 대답입니다.두 번째는 소스 인덱스 pdb를 설명합니다.

첫 번째 사용 예 ...

호출 규칙과 컴파일러가 사용한 최적화에 따라 디버거가 pdb가 없는 모듈을 통해 스택을 수동으로 해제하는 것이 불가능할 수도 있습니다.이는 특정 타사 라이브러리와 심지어 OS의 일부 부분에서도 발생할 수 있습니다.

Windows OS 내부에서 액세스 위반이 발생하는 시나리오를 생각해 보세요.스택 추적은 해당 OS 구성 요소가 디버거를 혼동시키는 특수 호출 규칙을 사용하기 때문에 자신의 응용 프로그램으로 풀리지 않습니다.공용 OS pdb를 다운로드하도록 기호 경로를 구성하면 스택 추적이 애플리케이션으로 풀릴 가능성이 높습니다.이를 통해 자신의 코드가 OS 시스템 호출에 전달한 인수가 무엇인지 정확하게 확인할 수 있습니다.(타사 라이브러리 내부 또는 자체 코드 내부의 AV에 대한 유사한 예)

두 번째 사용 예...

Pdb에는 또 다른 매우 유용한 속성이 있습니다. 즉, Microsoft에서 "소스 인덱싱"이라고 부르는 기능을 사용하여 일부 소스 제어 시스템과 통합할 수 있습니다.소스 인덱싱된 pdb에는 구성 요소를 빌드하는 데 사용된 정확한 파일 버전을 소스 제어에서 가져오는 방법을 지정하는 소스 제어 명령이 포함되어 있습니다.Microsoft의 디버거는 디버그 세션 중에 파일을 자동으로 가져오는 명령을 실행하는 방법을 이해합니다.이는 디버그 엔지니어가 소스 트리를 특정 빌드의 올바른 레이블에 수동으로 동기화할 필요가 없도록 해주는 강력한 기능입니다.이는 원격 디버깅 세션과 사후 크래시 덤프 분석에 특히 유용합니다.

"windows용 디버깅 도구" 설치(windbg)에는 srctool.exe를 사용하여 주어진 pdb에서 소스 인덱싱된 소스 파일을 확인하는 방법을 보여주는 예제를 제공하는 srcsrv.doc라는 문서가 포함되어 있습니다.

"어떻게 알 수 있습니까?"라는 질문에 대답하기 위해 디버거의 "모듈" 기능을 사용하면 해당 pdb가 있는 모듈이 무엇인지 알 수 있습니다.Windbg에서는 "lml" 명령을 사용합니다.Visual Studio의 디버그 메뉴에서 모듈을 선택합니다.(죄송합니다. 현재 버전의 Visual Studio가 없습니다.)

PDB는 명령을 원래 코드의 줄 번호에 매핑하는 데이터베이스 파일이므로 스택 추적을 얻을 때 코드의 줄 번호를 얻을 수 있습니다.관리되지 않는 DLL인 경우 PDB 파일은 스택 추적의 함수 이름도 제공하지만 해당 정보는 일반적으로 PDB가 없는 관리되는 DLL에만 사용할 수 있습니다.

pdb에서 얻는 주요 내용은 스택 추적을 위한 줄 번호와 실제 메서드 이름입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top