2014-03-27 11 views
5

액세스 위반을 추적하려고합니다. 재현성은 비결정적이고 드문 것으로 보이므로 조금 더 가설되기 전에 몇 가지 가정을 확인하고 싶습니다.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 옵션을 사용하고 있습니다.

  1. 새로운 아무것도 표시되지 않습니다 CatchUseOfFreedInterfaces 켜기 :

    은 또한 다음과 같은 설립했습니다. 나는 여전히 동일한 액세스 위반 및 추가 진단을받지 못합니다.
  2. 이 경우에 CatchUseOfFreedInterfaces이 켜져 있었는지 기억이 나지 않지만, 나는 한번 FullDebugModeScanMemoryPoolBeforeEveryOperation := True으로 충돌을 재현했습니다.
  3. 스레드 동시성 문제가 아닙니다. 내 응용 프로그램은 단일 스레드입니다. (사실, 이것은 사실이 아닙니다. 숨겨진 작업자 스레드를 만드는 Virtual TreeView를 사용하고 있습니다. 그러나 이것이 실제로 발생하면 버그는 Virtual TreeView에 있지만 내 코드는 아닙니다. 다소 어려울 수 있습니다.)

CheckHeapForCorruption에도 불구하고 아무 것도 잡히지 않았지만,이 예외는 코드가 힙을 손상시킬 수 있기 때문에 발생했을 수 있습니다. 이런 식으로 FastMM4를 충돌시킬 수있는 다른 것이 있습니까?

추가 진단을위한 제안 또는 충돌을보다 재현 가능하게 만드는 제안이 있습니까?

답변

4

이상하게 보일 수도 있지만 이것은 정상적인 동작입니다. CPU보기로 전환하면 명령 포인터가 FastMM_FullDebugMode.dll 모듈 안에 있음을 알 수 있습니다. FastMM의 일부 디버깅 기능은 의도적으로 액세스 위반을 일으킬 수 있습니다. 실행을 계속하면 응용 프로그램이 올바르게 실행됨을 알 수 있습니다.

디버깅 세션이 이러한 방식으로 중단되는 것은 매우 실망 스러울 수 있습니다. 관련 문제에 대해서는 had some discussion with the FastMM author입니다. FastMM 디버그 DLL이 이러한 방식으로 작동하도록 설계된 것처럼 보입니다. 결론은 이러한 외부 예외가 발생하는 것을 막기 위해 수행 할 수있는 많은 작업이 없다는 것입니다.

누구나이 좌절을 인식하고 좋은 해결책을 가지고 있다면, 나는 하나에 대해 영원히 감사 할 것입니다.

+0

나는 그런 예외 후에도 계속 실행을 시도했는지 궁금합니다. 이제 오류가 다시 발생하기를 기다린 다음 시도해야합니다. 이 기능이 작동하면 (즉, 제 사례에 적용 가능) 영원히 감사 할 것입니다! 내가 아는대로 곧 업데이트를 게시 할 것입니다. (며칠 또는 몇주가 걸릴 수도 있습니다.) –

+3

예. 지금 당장 하나가있어, 계속 사형을 선고 받았어. 오 잘,이 '문제'에 불과 2 일만 낭비했습니다. 고마워, 데이빗. –

+0

이것을 요약하면 다음과 같습니다. AV 만 무시합니까? – Ampere