상징 서버에 정확한 Windows DLL의 정확한 버전이없는 사후 사후 충돌 덤프 디버깅

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

문제

응용 프로그램 내에서 Minidumpwritedump 함수 (dbghelp.dll 참조)를 사용하여 응용 프로그램이 충돌 할 때마다 충돌 덤프 파일을 작성합니다.

또한 Symbol Server를 사용하여 모든 실행 파일 및 PDB 파일을 저장하므로 고객이 충돌 덤프 파일을 보낼 때마다 디버거가 올바른 버전의 실행 가능 및 디버그 정보를 선택합니다.

또한 Windows DLL (ntdll.dll, kernel32.dll, ...)과 Symple Server (Symchk 사용)에 디버그 정보를 저장합니다. 디버그 정보는 Microsoft의 공개 심볼 서버에서 가져 왔습니다.

대부분의 경우 이것은 다음을 제외하고는 완벽하게 작동합니다.

  • Windows DLL 중 하나에서 고객이 충돌합니다.
  • 그리고 고객은 내가 Symbol Server에 넣지 않은 DLL을 사용합니다.

이는 모든 Windows DLL의 모든 향료를 Symbol Server (특히 주간 패치와 함께)에 저장하는 것이 매우 불가능하기 때문입니다.

따라서 고객이 충돌하면 NTDLL.DLL의 버전 5.2.123.456을 사용하면 DLL의 정확한 버전을 내 Symbol Server에 넣지 않은 경우 고착되었습니다. Microsoft의 공개 기호 서버조차도 DLL 자체가 아니라 디버그 정보 만 제공하기 때문에 도움이되지 않습니다.

내 현재 솔루션은 고객에게 DLL을 요청하는 것이지만 항상 쉬운 것은 아닙니다. 따라서 나는 더 나은 솔루션을 찾고 있습니다.

DLL의 정확한 버전이 없어도 디버거가 올바른 통화 스택을 표시하거나 특정 DLL의 디버그 정보를로드하는 방법이 있습니까?

또는 모든 (또는 중요한) Windows DLL (Microsoft)의 모든 버전을 얻을 수있는 방법이 있습니까?

편집하다:

그 동안 나는이 문제를 해결하는 정말 쉬운 방법을 찾았습니다. 유틸리티 모듈러스테인 (참조 http://www.debuginfo.com/tools/modulerescue.html) Minidump 파일에서 더미 DLL을 생성 할 수 있습니다. 이러한 더미 DLL을 사용하면 디버거가 만족되며 Microsoft 서버에서 디버그 기호를 올바르게로드하기 시작합니다.

도움이 되었습니까?

해결책

Windbg의 기호 해상도를 완화 할 수 있습니다. 내 참조 대답 비슷한 질문에. 반면에 내가 여기에서 제안하는 솔루션은 DLL이 동일한 디버그 기호를 식별하는 다른 안내서를 갖는 것 외에. DLL의 다른 버전은 다른 바이너리를 가질 수 있으므로 기호가로드 할 수 있어도 제대로 일치하지 않을 것입니다.

다른 팁

Microsoft의 Symbol Server도 바이너리를 제공 할 것이라고 확신합니다. 나는 내 가게를 찾고 있고 많은 Microsoft .dll 파일을 볼 수 있습니다. 내 _nt_symbol_path가 다음과 같이 정의되어 있습니다

SRV*F:\Symbols\Microsoft*http://msdl.microsoft.com/download/symbols

이렇게하면 Microsoft의 공개 서버에서 복사하려고 시도하기 전에 내 지역 상점을 먼저 검색합니다.

당신은 가질 수 있습니다 다수의 심볼 경로의 기호 서버. 따라서 자신의 개인 모듈에 대한 자신의 서버와 OS 모듈의 공개 MS 서버를 가리키기 위해 기호 경로를 설정하면 참조하십시오. 기호 경로:

다음 초기 설정을 사용하여 Microsoft Public Symbol Store와 쉽게 결합 할 수 있습니다.

_NT_SYMBOL_PATH=srv*c:\mysymbols*http://msdl.microsoft.com/download/symbols;cache*c:\mysymbols

그만큼 Microsoft Public Symbol Store 문서화됩니다 http://msdl.microsoft.com/download/symbols.

? 어떤 부분이 작동하지 않습니까?

나는 당신의 상황에 처한 적이 없지만, 디버거가 당신에게 당신의 코드에 있던 통화 스택의 올바른 부분을 당신에게 Dark DLL으로의 통화까지 제공 할 것으로 기대합니다. 물론, 거기에서 실제 충돌 기호까지는 사용할 수 없지만 어떤 NTDLL API가 호출되었고 어떤 인수가 해당 전화로 전달되었는지 알 수 없습니까?

Minidump Debugging에 어떤 도구를 사용하고 있는지 : Windbg 또는 Vs.

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