C++-如何在程序退出时找到堆/堆栈损坏的源



我有一个项目,在'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);
}

"Color"类是该dll的一部分,但它不是问题的原因"HeapValidate"返回1,这意味着根据文档,堆是有效的。

有问题的dll包含数十万行代码,这使得调试更加困难。

在一个类似的问题上,我找到了使用WinDBG的建议,但我不确定该如何处理结果:

http://pastebin.com/zV27b51Z

它证实了这个问题是某种内存损坏,但我仍然不知道它是从哪里来的。

有什么方法可以可靠地找到起源吗?还是我一直在使用试错法?

我的操作系统是Windows 8.1,我使用的是Visual Studio 2013。

在调试器下运行应用程序,然后在断言消息框中按"重试"按钮。将调用DebugBreak,调试器将获取coltrol。

相关内容

  • 没有找到相关文章

最新更新