我是MFC&我正在维护一个MFC应用程序,它有一个CView窗口GUI,用于使用CTreeCtrl显示和操作树的值。我的所有功能都运行正常,但有时候我会崩溃。但是我仍然无法确定崩溃原因的任何模式。
有时在经历了一些常见的操作,例如更改值(我已经执行了100次并且工作正常),应用程序挂起或崩溃;有时为了在10-15分钟后最大化导致这种情况。有时树文本的大小变得奇怪,然后挂起/崩溃。检查调用堆栈到目前为止没有用,因为它始终指向DbgCRT
或某些内部MFC源文件。它是一个MDI应用程序,我注意到当文件数量更多或当前文件有一个大的嵌套树时会发生崩溃。
主要问题是我无法随意重现此错误。我所做的是对树进行各种操作,例如添加新的嵌套分支,更改值和在20-30分钟之后可能会发生这种崩溃。任何人请建议任何可能的方法来解决这个随机发生的错误。
示例gui:http://postimg.org/image/6ed619voh/“示例”
此外: 在被绞死之后一瞬间: http://s7.postimg.org/dn216ufzf/crashtime_snap.png
答案 0 :(得分:1)
听起来你正在泄露某种资源,很可能是GDI处理的。这些很难找到 - 您必须检查控件的每次使用(如CTreeCtrl
,位图,句柄等),以确保您在适当的时间正确释放它们(MSFT文档在这里是必不可少的)
可以提供帮助的一件事是在Windows中启动TaskManager并在与应用程序交互时查看GDI对象列。如果手柄数量不断攀升且您的应用程序逻辑说不应该,那么它会让您有机会开始寻找问题。
Visual Studio调试器还将为您提供内存泄漏的线索。关闭应用程序(调试版本)时,请查看输出窗口。如果您正在泄漏,输出窗口将具有指示内存泄漏的输出(类似于:Detected memory leaks
后跟地址和内存转储)。
此外,在Visual Studio调试器(调试版本)中运行构建。有时在运行时输出窗口中会有泄漏,内存覆盖等的线索。请注意这些。他们提供有价值的信息干净的程序运行在“输出”窗口中没有警告,ASSERTIONS,泄漏等。
如果您有上传项目的地方(并且不太大),我会为您查看。
在这里,勤奋和对细节的关注就是一切。
挂在那儿!