2010-02-10 1 views
4

내 애플리케이션에서 응용 프로그램이 충돌 할 때마다 MiniDumpWriteDump 함수 (dbghelp.dll 참고)를 사용하여 크래시 덤프 파일을 작성합니다.Symbol Server에 정확한 버전의 Windows DLL을 설치하지 않은 채 사기 충돌 덤프 디버깅

고객이 내게 크래시 덤프 파일을 보낼 때마다 디버거가 자동으로 실행 파일과 디버그 정보의 올바른 버전을 선택하도록 심볼 실행 서버를 사용하여 모든 실행 파일과 pdb 파일을 저장합니다.

또한 SymChk를 사용하여 Windows DLL (ntdll.dll, kernel32.dll, ...) 및 해당 디버그 정보를 심볼 서버에 저장합니다. 디버그 정보는 Microsoft의 공용 기호 서버에서 가져옵니다.

이 완벽하게 작동하는 대부분의 시간, 경우를 제외하고 :

  • 중 하나에서 고객의 충돌 윈도우 DLL의
  • 와 고객은 DLL의 나는 기호 서버에 넣어되지 않은 것을 사용

Symbol Server에 모든 Windows DLL의 모든 맛을 저장하는 것은 상당히 취소 할 수 없기 때문에 (특히 주간 패치가있는 경우) 특히 그렇습니다.

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

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

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

다른 방법으로 모든 (또는 중요한) Windows DLL (Microsoft)의 모든 버전을 구할 수 있습니까?

편집 : 나는이 문제를 해결하기 정말 쉬운 방법을 발견 그 동안

. 유틸리티 ModuleRescue (http://www.debuginfo.com/tools/modulerescue.html 참조)를 사용하면 미니 덤프 파일에서 더미 DLL을 생성 할 수 있습니다. 이러한 더미 DLL을 사용하면 디버거가 만족되고 Microsoft 서버에서 디버그 기호를 올바르게로드하기 시작합니다.

답변

2

WinDbg의 심볼 해상도를 완화 할 수 있습니다. 비슷한 질문에 내 answer을 참조하십시오. 반면에 여기서 제안한 솔루션은 DLL이 과 동일하다는 것입니다.은 디버그 기호를 식별하는 다른 GUID가 있어야합니다. 다른 버전의 DLL은 다른 바이너리를 가질 가능성이 높기 때문에 심볼을로드 할 수 있다고해도 심볼이 제대로 일치하지 않을 수 있습니다.

+0

이 솔루션을 살펴볼 시간을 좀주세요. 이것은 꽤 문제를 해결할 수있는 것처럼 보입니다. 내 상황에서 이것이 작동하는 것으로 확인되면이를 해결책으로 표시 할 것입니다. – Patrick

1

Microsoft의 심볼 서버에서도 바이너리를 제공합니다. 나는 내 가게를 찾고 있는데, 나는 마이크로 소프트 .dll 파일 톤을보고있다. 내 _NT_SYMBOL_PATH는

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

로는 마이크로 소프트의 공개 서버에서 그들을 복사하기 전에 먼저 내 로컬 저장소를 검색합니다이 방법을 정의했습니다.

+0

Microsoft 기호 서버에는 이진 기호가 아닌 기호 만 포함됩니다 (필자는 그 사실을 잘 알고 있습니다). _NT_SYMBOL_PATH도 비슷한 값으로 설정되어 있지만 고객이 사용하고 크래시 덤프 파일에서 참조되는 DLL이 내 시스템이나 심볼 서버 (또는 심볼 서버 캐시)에 없다면 디버그 정보는 ' 어느 쪽이든로드 할 수 있습니다. 따라서 기호는 심볼 서버에 DLL이있는 경우에만 도움이됩니다. – Patrick

+0

일반적으로 Microsoft Symbol 서버에는 바이너리가 들어 있지 않습니다. 하지만이 특별한 경우에는 그렇지 않을 수도 있습니다. –

+0

크래시 덤프를 디버깅 할 때 어떤 도구를 사용합니까? WinDBG는 pdb 만 있다면 dll없이 잘 작동합니다. 그리고 Visual Studio에서 dll을 사용하지 않고 기호를로드 할 수없는 경우를 보았습니다. – Oleg

0

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

필자는 자신의 상황에 정확하게 들어 본 적이 없지만 디버거가 코드에 있던 호출 스택의 정확한 부분을 어두운 DLL 호출까지 제공 할 것으로 기대합니다. 물론 실제 충돌에 이르기까지 기호는 사용할 수 없지만 어떤 NTDLL API가 호출되었는지, 어떤 인수가 해당 호출에 전달되었는지 확인할 수 없습니까?

미니 덤프 디버깅을 위해 사용하는 도구는 WinDBG 또는 VS입니다.

+0

우리가 생산 실행 파일을 만들 때마다 우리는 그것을 (그리고 그 디버그 정보를) 심볼 서버에 저장한다. 따라서 고객으로부터 크래시 덤프 파일을 얻으면 호출 스택에서 우리 자신의 함수를 볼 수있다. 문제는 Windows DLL에서 응용 프로그램이 충돌 (잘못된 인수를 전달했기 때문에)하고 DLL이 내 PC에 설치되어 있지 않다는 것입니다 (고객이 다른 OS 버전 또는 다른 패치를 가지고 있기 때문에 볼 수 없음). 호출 스택이나 디버거가 호출 스택이 신뢰할 수 없다고보고합니다 (종종 그렇습니다). 이것은 MS 사이트에서 디버그 정보 만 고객의 DLL을 다운로드 할 수 없기 때문입니다. – Patrick

+0

저는 주로 VS를 사용합니다. 그러나 WinDbg에 대한 해결책을 찾았다면 그 경우에 기꺼이 사용할 것입니다. – Patrick

1

심볼 경로에 심볼 서버가 여러 개있을 수 있습니다. 그래서 단순히 자신의 개인 모듈에 대한 자신의 서버를 가리 키도록 기호 경로를 설정하고, OS 모듈에 대한 공공 MS 서버로, Symbol Path를 참조하십시오

것은이 쉽게 마이크로 소프트 공용 기호 저장소와 결합 될 수있다 다음의 초기 설정을 사용하여 :

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

Microsoft Public Symbol Storehttp://msdl.microsoft.com/download/symbols로 설명된다.