2015-02-07 91 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