我有一個項目導致兩個斷言連續失敗,'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的建議,但我不知道該怎麼做,結果:
它確認問題是某種內存損壞,但我仍然不知道它起源於何處。
有什麼辦法可靠地找到原點,還是我堅持使用試驗和錯誤?
我的操作系統是Windows 8.1,我使用Visual Studio 2013年
該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