2010-01-20 66 views
3

我正在使用Visual Studio来调试ATL应用程序。当我从OnCopyData返回TRUE时,为什么会触发一个断点?

当我在此代码跨过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 有焦点。

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

该消息有点模糊,我想知道我可以使用哪些工具获取更多信息。在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

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

以下明显有缺陷的代码给出了一个简单的例子:

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

当我跑这不应用验证,它运行完成,没有明显的错误。但是,使用应用程序验证程序,它会导致异常(0x80000003)。 Application Verifier强制将分配放在段的末尾(例如,0x1e9eff8)。 memcpy导致写入后面的段,导致memcpy调用期间发生异常。如果在这个简单的例子中覆盖较少,那么在调用free之前不会发生中断,但这仍然比没有例外更好。这是一个非常酷的工具。

+0

不错,谢谢!我还没有尝试过,但在我这样做时会接受这个答案。 – 2010-01-20 23:09:42

+0

还没有尝试过,但它竟然是堆腐败(发现它使用试验和错误),但我会记得下次应用程序验证程序。 – 2010-01-29 21:15:37

0

你的内存(也许是你的筹码)由任性的指针其他地方的代码的破坏。

+0

是的,但我怎么找到它?代码非常庞大。也许它与OnCopyData无关 - 或者是因为我对一个传入的参数做了一些坏事(我不认为是这种情况)。我可以使用哪些工具来获取导致错误的代码行? – 2010-01-20 21:20:57

+0

除非你可以包装可能的罪犯在智能,检查,包装你可能不得不求助*分而治之* - 禁用一些/半/ ...的代码,如果它不再发生你知道在哪里看得更深。 – 2010-01-20 21:26:01

相关问题