2015-02-07 71 views
-1

我有一個項目導致兩個斷言連續失敗,'main'函數完成後。這是非常有問題的,因爲它不會顯示導致問題的代碼片段。如何在程序退出時找到堆/堆棧損壞的來源

我能夠稍微縮小問題的範圍。空主要功能:

int main(int argc,char* argv[]) 
{ 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    return main(__argc,__argv); 
} 

一切工作正常。但是當我使用任何類或函數從一個特定的DLL(這是該項目的一部分),問題開始出現:

int main(int argc,char* argv[]) 
{ 
    Color col(255,0,0,255); 
    col.r += 1; 
    int r = HeapValidate(GetProcessHeap(),0,nullptr); 
    std::cout<<r<<std::endl; 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    return main(__argc,__argv); 
} 

「顏色」類是DLL的一部分,但它不是問題的原因。 'HeapValidate'返回1,這意味着根據文檔堆是有效的。

有問題的dll包含數十萬行代碼,這使得調試更加困難。

在一個類似的問題,我發現使用WinDbg的建議,但我不知道該怎麼做,結果:

http://pastebin.com/zV27b51Z

它確認問題是某種內存損壞,但我仍然不知道它起源於何處。

有什麼辦法可靠地找到原點,還是我堅持使用試驗和錯誤?

我的操作系統是Windows 8.1,我使用Visual Studio 2013年

+0

該DLL可能有一個單獨的堆:https://msdn.microsoft.com/en-us/library/windows/desktop/ee175820(v=vs.85).aspx另外,看看該DLL是否做了任何可疑的事情在其分離代碼中:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs.85%29.aspx – DCoder 2015-02-08 07:39:22

回答

0

運行在斷言消息框下的調試和按重試按鈕的應用程序。 DebugBreak將被調用並且調試器將採用控制。

+0

這不起作用,因爲問題發生在主 - 電話已經返回。調試器不能再進入這一點。 – Silverlan 2015-02-07 19:14:37

+0

請指定確切的程序行爲。你是如何發現這種斷言失敗發生的? – Nikerboker 2015-02-08 06:51:39