当我从OnCopyData返回TRUE时为什么可能触发断点?

时间:2010-01-20 21:07:54

标签: c++ windows atl

我正在使用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触发了一个断点   foob​​ar.exe。

     

这可能是由于腐败造成的   堆,表示中的错误   foob​​ar.exe或其中的任何DLL   装了。

     

这也可能是由于用户造成的   在phonejournal.exe上按F12   有重点。

     

输出窗口可能有更多   诊断信息。

消息有点模糊,我想知道我可以使用哪些工具来获取更多信息。调试器在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 个答案:

答案 0 :(得分:4)

微软的Application Verifier可能对此有所帮助。如果应用程序具有堆损坏,则此实用程序可能会在发生错误时导致异常。但是,它在运行时可以使用大量内存,因为它可以在内存分配方案中产生很大的变化。

下面明显有缺陷的代码给出了一个简单的演示:

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

当我在没有应用程序验证程序的情况下运行它时,它运行完成而没有明显的错误。但是,使用应用程序验证程序时,它会导致异常(0x80000003)。应用程序验证器强制分配位于段的末尾(例如,0x1e9eff8)。 memcpy导致写入后续细分,导致memcpy调用期间出现异常。如果在这个简单示例中覆盖较少,则在free调用之前不会发生中断,但这仍然优于无异常。这是一个非常酷的实用程序。

答案 1 :(得分:0)

您的内存(可能是您的堆栈)被代码中其他位置的任意指针损坏。