Почему может возникать точка останова, когда я возвращаю TRUE из OnCopyData? - PullRequest
3 голосов
/ 21 января 2010

Я использую Visual Studio для отладки приложения ATL.

Когда я перехожу через return TRUE в этом коде, возникает ошибка:

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;

}

Это окно сообщения, которое отображается:

Windows сработала точка останова в foobar.exe.

Это может быть связано с повреждением куча, которая указывает на ошибку в foobar.exe или любой из библиотек DLL это загружен.

Это также может быть связано с пользователем нажатие F12 в то время как phonejournal.exe имеет фокус.

Окно вывода может иметь больше диагностическая информация.

Сообщение немного расплывчато, и мне интересно, какие инструменты я могу использовать для получения дополнительной информации. Отладчик прерывается при вызове на AtlTraceVU в atltrace.h:

 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);
 }

Ответы [ 2 ]

4 голосов
/ 21 января 2010

Microsoft Application Verifier может помочь с этим. Если приложение имеет повреждение кучи, эта утилита может вызвать исключение при возникновении ошибки. Тем не менее, он может использовать много памяти во время работы, поскольку может привести к значительным изменениям в схемах выделения памяти.

Следующий явно некорректный код дает простую демонстрацию:

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

Когда я запустил это без верификатора приложения, оно завершилось без явной ошибки. Однако с помощью верификатора приложения возникла исключительная ситуация (0x80000003). Верификатор приложения заставил выделение быть в конце сегмента (например, 0x1e9eff8). memcpy привел к записи в последующий сегмент, что привело к исключению во время вызова memcpy. Если в этом простом примере перезапись меньше, перерыв не происходит до вызова free, но это все же лучше, чем отсутствие исключения. Это довольно крутая утилита.

0 голосов
/ 21 января 2010

Ваша память (возможно, ваш стек) повреждена странным указателем где-то еще в коде.

...