我有一个项目导致两个断言连续失败,'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