2010-02-04 3 views
0

_heapwalk를 사용하여 프로세스의 표준 힙에 대한 통계를 수집합니다._heapwalk은 _HEAPBADNODE를보고 중단 점 또는 루프를 끝없이 발생시킵니다.

  • _HEAPBADNODE 일부 중단 점을 _heapWalk 내부
  • 액세스 위반이 손상있어 수도 나에게 힙을 말하고, _heapwalk 내부 트리거
  • 을 반환됩니다

    는 특정 상황에서 내가 좋아하는 예기치 않은 동작을 관찰합니다.

다른 컴퓨터에서 다른 동작을 보았습니다. 한 Windows XP 32 비트 시스템에서는 모든 것이 잘 보였지만 두 Windows XP 64 비트 시스템에서는 언급 된 증상을 보았습니다.

LowFragmentationHeap이 활성화 된 경우에만이 동작을 보았습니다.

조금 놀았습니다. 프로그램에서 여러 번 힙을 여러 번 걸어갔습니다. _heapWalk에 대한 후속 호출 사이에 아무 것도하지 않는 첫 번째 (모든 사항이 좋음). 그리고 다시 이번에 _heapWalk에 대한 두 번의 호출 사이에 통계를 수집하기위한 몇 가지 작업을 수행합니다. 내가 그곳에서 무엇을했는지에 따라 때로는 설명 된 증상이 나타납니다. 여기

마지막 질문 : 정확히 안전하고 완벽한 힙 도보 실행 중에 _heapWalk 두 후속 호출 사이에서 할 안전하지 않습니다 무엇 무엇

?

당연히 힙을 조작하지 않아야합니다. 그러므로 나는 newdelete으로 전화하지 않는다는 것을 다시 한번 확인했다. 그러나 필자가 관찰 한 바에 따르면 일부 매개 변수를 전달하는 함수 호출로 인해 내 힙 워크가 이미 실패하게됩니다. 나중에 함수 호출을 추가하고 매개 변수의 수를 늘리면이 함수에 전달됩니다. 내 감정은 두 명의 매개 변수가 전달 된 두 가지 함수 호출이었고 더 이상 작동하지 않았습니다.

그러나 이유를 알고 싶습니다. 이것이 어떤 이유에서 어떤 기계에서 이 아닌이 발생합니까? 왜 LowFragmentationHeap을 사용하는 경우에만 이런 현상이 발생합니까? 마지막으로

샘플 코드 :

#include <malloc.h>

void staticMethodB(int a, int b)
{
}

void staticMethodA(int a, int b, int c)
{
staticMethodB(3, 6);
return;
}

...

_HEAPINFO hinfo;
hinfo._pentry = NULL;
while((heapstatus = _heapwalk(&hinfo)) == _HEAPOK)
{

//doing nothing here works fine 
//however if i call functions here with parameters, this causes 
//_HEAPBADNODE or something else 
staticMethodA(3,4,5); 

}
switch(heapstatus)
{
...
case _HEAPBADNODE:
assert(false);
/*ERROR - bad node in heap */
break;
...

답변

0

사용 HeapWalk, _heapwalk 없습니다.

HeapLock 및 HeapUnlock을 사용하여 힙 열거 중에 힙을 잠그십시오.

확실히 함수 호출이 힙을 수정하고 열거를 무효화하는 것처럼 들립니다. 일부 모호한 조언, 아마도 이러한 함수 호출에 필요한 메모리를 위해 새로운 힙을 만들 수 있습니다. 이것은 이러한 정적 함수의 상당한 재 작업을 필요로 할 수도 있습니다.

+0

안녕하세요, 테리, 답변 해 주셔서 감사합니다. 당신의 제안에 따라, 나는 대신 HeapWalk를 사용하여 놀았습니다. (나는 실제로 힙 잠금을했습니다.) HeapWalk가 더 강력하게 작동한다고 느낍니다. 나는 위에서 언급 한 행동을 재현 할 수 없었다. HeapWalk()를 사용하겠습니다.HeapWalk() 중에 힙을 손상시키는 방법을 이해하지 못하는 이상한 느낌, HeapWalk()에서는 실제로 원래의 게시에 설명 된 것과 동일한 작업을 수행합니다. 그건 그렇고, 난 내 정적 메서드를 모든 힙을 사용하여 인식하지 못합니다. 거기에 스택 변수 만 있습니다. 어쨌든 고마워... –