2010-01-20 3 views
3

Visual Studio를 사용하여 ATL 응용 프로그램을 디버깅하고 있습니다. 이 코드에 return TRUE을 통해 단계 때내 OnCopyData에서 TRUE를 반환 할 때 왜 중단 점을 트리거 할 수 있습니까?

는 오류가 발생합니다

Windows가 foobar.exe에 중단 점을 트리거했습니다

BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { 

    // Code snipped from here - maybe this causes stack/heap corruption? 

    // I have a breakpoint here, if I step over (F10), AFX trace message 
    // is shown (as below) 
    return TRUE; 

} 

이 같이있어 메시지 상자입니다.

이것은 foobar.exe 또는 로드 한 DLL 중 어느 한 버그를 나타내는 힙의 손상에 기인 할 수있다.

phonejournal.exe 에 포커스가있는 동안 F12 키를 누름으로써 발생할 수 있습니다.

출력 창이 더 많은 진단 정보가있을 수 있습니다.

메시지가 약간 애매하고 자세한 정보를 얻으려면 어떤 도구를 사용할 수 있는지 궁금합니다. atltrace.h에서 AtlTraceVU에 대한 호출에 디버거 나누기 :

inline void __cdecl CTrace::TraceV(const char *pszFileName, int nLine, 
    DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFmt, va_list args) const 
{ 
    AtlTraceVU(m_dwModule, pszFileName, nLine, dwCategory, nLevel, pszFmt, args); 
} 

답변

4

Microsoft의 Application Verifier이 도움이 될 수 있습니다. 응용 프로그램에 힙이 손상되면이 유틸리티로 인해 오류가 발생할 때 예외가 발생할 수 있습니다. 그것은 메모리 할당 방식에 큰 변화를 가져올 수 있기 때문에 실행시 많은 메모리를 사용할 수 있습니다.

다음 분명히 결함 코드는 간단한 데모를 제공합니다 :이 응용 프로그램의 검증없이, 그것은 명백한 오류로 완료 실행 실행

char *pc = malloc(4); 
memcpy(pc, "abcdabcd", 9); 
free(pc); 

. 그러나 응용 프로그램 검증자를 사용하면 예외가 발생했습니다 (0x80000003). Application Verifier는 할당이 세그먼트 끝 (예 : 0x1e9eff8)이되도록했습니다. memcpy이 후속 세그먼트에 쓰여지고 memcpy 호출 중에 예외가 발생했습니다. 이 간단한 예제에서 덮어 쓰기가 적 으면 free 호출이 발생할 때까지 중단이 발생하지 않지만 여전히 예외없이 더 좋습니다. 그것은 아주 멋진 유틸리티입니다.

+0

니스, 고마워! 나는 이것을 아직 시도하지 않았지만 이것을 할 때 대답으로 받아 들일 것입니다. –

+0

아직 시도하지는 않았지만 힙 손상 (시행 착오를 통해 발견 됨)이 밝혀졌지만 다음 번에 Application Verifier를 기억할 것입니다. –

0

메모리 (아마 당신 스택) 코드에서 다른 곳 제멋대로 포인터에 의해 손상된다.

+0

그래, 어떻게 찾습니까? 코드는 방대하다. 어쩌면 OnCopyData와 아무런 상관이 없습니다. 아마도 전달 된 args 중 하나에 나쁜 영향을 미치기 때문일 수 있습니다. 오류의 원인이되는 코드 줄을 가져 오기 위해 사용할 수있는 도구는 무엇입니까? –

+0

가능한 범죄자를 현명한 방법으로 감쌀 수없는 한, 코드의 wrapper를 * 나누고 정복 *해야합니다. 더 이상 발생하지 않으면 코드의 일부/절반 /을 비활성화하십시오. 좀 더 깊게 보아라. –

관련 문제