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

时间:2015-02-07 17:00:47

标签: c++ visual-studio stack heap memory-corruption

我有一个项目,在主要'功能完成之后,连续导致两个断言失败。这是非常有问题的,因为它没有向我显示导致问题的代码段。

我能够稍微缩小问题范围。使用空主函数:

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);
}

&#39;颜色&#39; class是该dll的一部分,但它不是问题的原因。 &#39; HeapValidate&#39;返回1,表示堆根据文档有效。

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

在类似的问题上,我发现了使用WinDBG的建议,但我不确定如何处理结果:

http://pastebin.com/zV27b51Z

它确认问题是某种内存损坏,但我仍然不知道它来自何处。

有没有办法可靠地找到原点,还是我坚持使用反复试验?

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

1 个答案:

答案 0 :(得分:0)

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