2011-07-06 7 views
7

MiniDumpWriteDump를 통해 응용 프로그램의 런타임 중에 기록 된 전체 미니 덤프가 있습니다. 미니 덤프는 내 개발 컴퓨터와 다른 OS 버전의 컴퓨터에서 생성되었습니다.미니 덤프에서 스택 추적을 추출하는 방법은 무엇입니까?

이제 dbghelp.dll을 사용하여 미니 덤프에서 스택 추적을 추출하는 프로그램을 작성하려고합니다. 나는 MINIDUMP_MODULE_LIST를 걷고 SymLoadModule64를 호출하지만 이것은 공용 심볼 서버에서 pdbs (kernel32 등)를 다운로드하지 못합니다. 심볼 경로에 "C : \ Windows \ System32"를 추가하면 dll을 찾아 심볼을 다운로드하지만 물론 미니 덤프의 dll과 일치하지 않으므로 결과가 유용하지 않습니다.

그렇다면 dbghelp.dll에 적절한 pdbs를 다운로드하여 사용하는 방법은 무엇입니까?

[편집] 내가 SymLoadModule64 만 dbghelp 다운로드 할 PDB 파악하기 위해 단독으로는 불가능하므로 분명히 SymLoadModule64으로, 파일 이름과없는 버전/검사 정보를 취한다는 것은 잊어

.

정보는 실제로 MINIDUMP_MODULE_LIST에서 사용할 수 있지만 dbghelp API로 다시 전달하는 방법을 알지 못합니다.

추가 매개 변수를 사용하는 SymLoadModuleEx가 있지만, 필자가 필요로하는 것이거나 추가 매개 변수로 전달해야하는 것이 있는지는 알 수 없습니다.

[편집]

운이 지금까지 존재이기도 디버깅 SDK에서 중 Dbghelp.dll와 함께 배포 dbgeng.dll 내가 눈치 챘지만. MSDN은 문서화가 잘되어있어 windbg가 사용하는 것과 동일한 엔진이라고합니다. 어쩌면 스택 추적을 추출하는 데 사용할 수 있습니다.

MSDN이 개별 구성 요소 만 문서화하고 있지만 함께 사용하는 방법과 달리 미니 덤프를 처리하는 데있어 dbgeng.dll을 사용하는 방법에 대해 누구나 언급 할 수 있다면 도움이 될 것입니다. 내가 대신의 Dbghelp.dll dbgeng.dll 사용하는 것이 가능하다 업데이트에서 언급 한 것처럼 보인다,

:

+0

당신은 아마도 미니 덤프를 너무 작게 만들었을 것입니다. DumpType 인수가있는 팅커. Debug + Windows + Modules 목록에 정확한 DLL 경로, 버전 및 타임 스탬프가 표시되는지 확인하십시오. –

+0

아니, 문제가되지 않습니다. WinDbg에서 미니 덤프를로드하고 PDB를 올바르게 다운로드 할 수 있습니다. WinDbg에서 수동으로 덤프를 검사하는 대신 스택 검색을 자동화하려고합니다. – Zarat

+1

해킹 경로를 가고 싶다면 ntsd에 명령을 내리고 출력을 캡처 할 수 있습니다. –

답변

8

그냥 경우에 다른 사람이 여기에 내가하고 결국 무엇을, 덤프에서 스택 트레이스를 추출하는 자동화 싶어 WinDbg가 사용하는 엔진과 동일해야합니다. 시행 착오 후에 WinDbg와 같은 심볼 로딩 메커니즘으로 좋은 스택 추적을 얻는 방법이 있습니다.

  • 전화 DebugCreate 심볼로드
  • (WinDbg를 사용하는 옵션 MSDN 참조)하는 방법을 구성 할 수 IDebugSymbols3에게,
  • 사용 IDebugSymbols3.SetSymbolOptions을 디버그 엔진
  • IDebugClient4, IDebugControl4에 대한
  • 쿼리의 인스턴스를 얻을 수 있습니다 덤프에게
  • 사용 IDebugCo를 엽니 다
  • 사용 IDebugClient4.OpenDumpFileWide WinDbg는에 할 것 같은
  • 사용 IDebugSymbols3.SetSymbolPath는 기호 경로를 설정합니다 ntrol4.WaitForEvent 덤프가로드 될 때까지 대기합니다.
  • 덤프에 저장된 예외를 선택하려면 IDebugSymbols3.SetScopeFromStoredEvent를 사용하십시오.
  • IDebugControl4를 사용하십시오.GetStackTrace의 마지막 몇 스택 스택 콜백
  • 에게 등록 취소
  • 사용 IDebugClient4.SetOutputCallbacks 프레임 처리 디코딩 스택 트레이스를
  • 사용 IDebugControl4.OutputStackTrace를 수신하는 수신기를 등록
  • 사용 IDebugClient4.SetOutputCallbacks 프레임 가져 인터페이스를 해제하십시오.

다음과 같은 호출이 스택 추적을 추출하지 못하기 때문에 WaitForEvent를 호출하는 것이 중요합니다.

또한 거기에 메모리 누수가있는 것 같습니다. 제대로 청소하지 않거나 dbgeng.dll 내부의 항목인지는 알 수 없지만 20 개 덤프마다 프로세스를 다시 시작할 수 있습니다. 더는 조사하지 않았다.

관련 문제