문제

MS VC ++ 6.0에 디버깅중인 코드가 있습니다. 어떤 이유로, 동적으로 할당 된 메모리를 삭제하려는이 특정 지점에서, 그것은 깨지고 "Blah blah의 코드에서 호출 된 사용자 브레이크 포인트"라는 팝업 메시지 상자를 얻습니다. 보다

*memory address* int      3

이상한 점은 코드에 이와 같은 어셈블리 명령을 호출하는 곳이 없다는 것입니다 (ASM int 3은 x86의 하드웨어 브레이크 명령이라고 생각합니까?).

이것을 일으킬 수있는 것은 무엇입니까?

편집 : 답변 : 내 코드는 배열의 "끝을 걷는"것이었지만 0xFDFDFDFD로 Visual Studio Debug로 표시된 위치에서만 Noman'sland 울타리라고도합니다. 한 가지 오류.이 배열은 오류가 발생했을 때 메모리를 제거하는 지점과 관련이 없습니다. 그것을 발견하기가 더 어려워 .. :(

도움이 되었습니까?

해결책

힙 부패를 발견 한 디버그 힙 루틴에서 코드를 치고있을 것입니다.

int 3에 도달하면 통화 스택은 어떻게 생겼습니까?

편집 : 주석의 스택 추적을 기반으로, 루틴 _CrtIsValidHeapPointer() 해방되는 포인터가 나쁘다고 말하고 있습니다. 다음은 MSVC의 DBGHEAP.C 출처의 코드 스 니펫입니다.

    /*
     * If this ASSERT fails, a bad pointer has been passed in. It may be
     * totally bogus, or it may have been allocated from another heap.
     * The pointer MUST come from the 'local' heap.
     */
    _ASSERTE(_CrtIsValidHeapPointer(pUserData));

pUserData 삭제하는 포인터의 값이 될 것입니다.

다른 팁

(ASM int 3이 x86의 하드웨어 브레이크 명령이라고 생각합니까?

그것은이다. 라고 불린다 "하드웨어 브레이크 포인트". 프로젝트 소스 코드와 함께 vs 디버거를 사용하는 경우 중단 점과 같습니다 (그러나 코드). VS2005 이후 디버거없이 응용 프로그램이 시작되면 관리되지 않은 예외를 시작한 경우와 같이 응용 프로그램은 단순히 충돌합니다.

많은 회사에는 코드에 해당 중단 점을 추가하는 데 사용되는 간단한 매크로가 있습니다. 일부 (단단하고 희귀 한) 사례에서 어서 및 예외를 대체 할 수 있습니다.

#define BREAKPOINT __asm { int 3; }

BREAKPOINT;

보다 :

그래서 나는 이것을하는 매크로 나 객체를 찾는 것이 좋습니다. 아니면 코드가없는 모듈 (dll/lib)에서 apped?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top