2010-01-19 2 views
3

나는 WinDbg를 사용하는 법을 배우고 있으며 이것에 대해서는 잘 모르겠다.하지만 내 프로그램이 _DPH_HEAP_BLOCK 대신 할당 된 힙을 사용하지 않는다면 대신 할당 된 데이터에 _HEAP_ENTRY이 있어야합니다.포인터가 있다면, 그것이 속한 _HEAP_ENTRY를 어떻게 찾을 수 있습니까?

힙에 할당 된 데이터의 주소가 주어지면 _HEAP_ENTRY과 함께 (WinDbg에서) 어떤 것이 있는지 찾을 수 있습니까? 아니면 내 질문이 맞지 않습니까?

내 질문의 루트는 덤프의 할당이 해제되었는지 또는 힙이 어떻게 든 손상되었는지 여부를 알고 싶습니다. 활성화 된 페이지 힙으로

답변

4

!heap -p -a <address>

,이 (잠재적으로 무료 /이 힙 블록을 할당 할 수있는 마지막 사람의 호출 스택 포함) 유용한 정보를 덤프 -이이 _DPH_HEAP_BLOCK을 시각화 생각합니다.

페이지 힙을 사용하지 않으면 기본 정보 만 표시됩니다. 그다지 유용하지 않습니다. 이건 일반적인 _HEAP_ENTRY 구조체라고 생각합니다. 두 번째 접근 시점에서 double frees/etc를 디버깅하는 것은 거의 불가능합니다 (적어도 자신과 같은 단순한 필사자 만 가능).

힙 문제가 발생하면 AppVerifier를 통해 즉시 힙 유효성 검사를 활성화 한 다음 다시 repo합니다. 이 두 가지를 수행합니다

  1. 그것은 때때로 그것은 !heap -p -a <address> 명령이 덤프하게

  2. 명백한 버그의 근본 원인을, 이전 시점에 "더까지"해제 된 메모리에 액세스하는 AV 년대를 이동 많은 마지막으로 해제 사람의 호출 스택을 포함하여보다 유용한 정보, (!)

가! 힙 + 응용 프로그램 검증은 목록에 메모리 쓰기 중단 점에 아마 두 번째 꽤 멋진, 그리고 닌자 - windbg- 모두가해야하는 foo 알고있다.

+0

슬프게도, 나는 아무런 재능도 갖고 있지 않습니다. – Sydius

+0

또한 주소에서 힙 구조로 돌아갈 수 없습니까? 그렇지 않으면 무료로 작동하는 방법은 무엇입니까? – Sydius

+0

페이지 힙이 활성화되어 있지 않으면 동일한 명령 (! heap -p -a

)이 할당에 대한 HEAP_ENTRY를 덤프 할 것이라고 생각합니다. HEAP_ENTRIES는 그다지 유용하지 않습니다. 이 버그를 추적하는 데 도움이되는 디버그 힙 항목의 콜백입니다. –