2010-01-20 67 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

相關問題