액세스 위반을 추적하려고합니다. 재현성은 비결정적이고 드문 것으로 보이므로 조금 더 가설되기 전에 몇 가지 가정을 확인하고 싶습니다.FastMM4, DebugGetMem의 간헐적 인 액세스 위반
액세스 위반이 다음 코드, 기능 DebugGetMem에서 FaseMM4 버전 4.991 제기된다
가if (ASize > (MaximumMediumBlockSize - BlockHeaderSize - FullDebugBlockOverhead))
or CheckFreeBlockUnmodified(Result, GetAvailableSpaceInBlock(Result) + BlockHeaderSize, boGetMem) then
begin
{Set the allocation call stack}
GetStackTrace(@PFullDebugBlockHeader(Result).AllocationStackTrace, StackTraceDepth, 1);
{Set the thread ID of the thread that allocated the block}
==> PFullDebugBlockHeader(Result).AllocatedByThread := GetThreadID; <<=== AV Here
{Block is now in use: It was allocated by this routine}
PFullDebugBlockHeader(Result).AllocatedByRoutine := @DebugGetMem;
예외이다 :
Project Workstation.exe raised exception class $C0000005 with message 'access violation at 0x01629099: read of address 0x66aed8f8'.
호출 스택은 일반적으로 동일하다 . 그것은 내가 실제로 연관성이 있다고 의심 스럽지만 (이라고 부르는 가상 트리 뷰의 페인트 이벤트에서 호출됩니다. Format은 동적 메모리를 할당합니다.)
저는 FullDebugMode
(분명히)과 CheckHeapForCorruption
옵션을 사용하고 있습니다.
- 새로운 아무것도 표시되지 않습니다
CatchUseOfFreedInterfaces
켜기 : 은 또한 다음과 같은 설립했습니다. 나는 여전히 동일한 액세스 위반 및 추가 진단을받지 못합니다. - 이 경우에
CatchUseOfFreedInterfaces
이 켜져 있었는지 기억이 나지 않지만, 나는 한번FullDebugModeScanMemoryPoolBeforeEveryOperation := True
으로 충돌을 재현했습니다. - 스레드 동시성 문제가 아닙니다. 내 응용 프로그램은 단일 스레드입니다. (사실, 이것은 사실이 아닙니다. 숨겨진 작업자 스레드를 만드는 Virtual TreeView를 사용하고 있습니다. 그러나 이것이 실제로 발생하면 버그는 Virtual TreeView에 있지만 내 코드는 아닙니다. 다소 어려울 수 있습니다.)
CheckHeapForCorruption
에도 불구하고 아무 것도 잡히지 않았지만,이 예외는 코드가 힙을 손상시킬 수 있기 때문에 발생했을 수 있습니다. 이런 식으로 FastMM4를 충돌시킬 수있는 다른 것이 있습니까?
추가 진단을위한 제안 또는 충돌을보다 재현 가능하게 만드는 제안이 있습니까?
나는 그런 예외 후에도 계속 실행을 시도했는지 궁금합니다. 이제 오류가 다시 발생하기를 기다린 다음 시도해야합니다. 이 기능이 작동하면 (즉, 제 사례에 적용 가능) 영원히 감사 할 것입니다! 내가 아는대로 곧 업데이트를 게시 할 것입니다. (며칠 또는 몇주가 걸릴 수도 있습니다.) –
예. 지금 당장 하나가있어, 계속 사형을 선고 받았어. 오 잘,이 '문제'에 불과 2 일만 낭비했습니다. 고마워, 데이빗. –
이것을 요약하면 다음과 같습니다. AV 만 무시합니까? – Ampere