我正在使用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 装了。
这也可能是由于用户造成的 在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);
}
答案 0 :(得分:4)
微软的Application Verifier可能对此有所帮助。如果应用程序具有堆损坏,则此实用程序可能会在发生错误时导致异常。但是,它在运行时可以使用大量内存,因为它可以在内存分配方案中产生很大的变化。
下面明显有缺陷的代码给出了一个简单的演示:
char *pc = malloc( 4 );
memcpy( pc, "abcdabcd", 9 );
free( pc );
当我在没有应用程序验证程序的情况下运行它时,它运行完成而没有明显的错误。但是,使用应用程序验证程序时,它会导致异常(0x80000003)。应用程序验证器强制分配位于段的末尾(例如,0x1e9eff8)。 memcpy
导致写入后续细分,导致memcpy
调用期间出现异常。如果在这个简单示例中覆盖较少,则在free
调用之前不会发生中断,但这仍然优于无异常。这是一个非常酷的实用程序。
答案 1 :(得分:0)
您的内存(可能是您的堆栈)被代码中其他位置的任意指针损坏。