2013-05-27 220 views
0

我是MFC新手&我正在维护一个MFC应用程序,它有一个CView窗口GUI,用于显示和操作使用CTreeCtrl的树的值。我的所有功能都能正常工作,但有时会发生崩溃。但我仍然无法找出任何形式的原因崩溃。MFC应用程序突然崩溃

有时在经过一些常见的操作(如我已经执行了100次&工作正常)后,应用程序挂起或崩溃;有时为了在10-15分钟之后最大化造成这种情况。有时树文本变得奇怪粗大,然后挂起/崩溃。检查调用栈直到现在没有用,因为它总是指向DbgCRT或某些内部MFC源文件。这是一个MDI应用程序,我注意到当文件数多或当前文件有一个大的嵌套树时会发生崩溃。

主要问题是我无法随意再现此错误。我所做的就是对树进行各种操作,如添加新的嵌套分支,更改值&可能会在此次崩溃的20-30分钟后发生。任何人都请提出解决这个随机发生的错误的任何可能的方法。

样品GUI:http://postimg.org/image/6ed619voh/ “样本”

此外: 它被绞死后瞬间: http://s7.postimg.org/dn216ufzf/crashtime_snap.png

回答

1

这听起来像你正在泄漏某种资源,最有可能的GDI处理。这些可能很难找到 - 您必须检查每个控件的使用情况(如CTreeCtrl,位图,句柄等),以确保您在正确的时间正确释放它们(MSFT文档在此处不可缺少)。

  1. 有一件事可以帮助您在Windows中启动TaskManager,并在您与应用程序进行交互时查看GDI对象列。如果处理次数持续攀升,并且您的应用逻辑认为它不应该出现,它会为您提供一个开始寻找问题的地方。

  2. Visual Studio调试器还将为您提供内存泄漏的线索。在关闭应用程序(调试版本)时,请查看输出窗口。如果泄漏,输出窗口将显示指示内存泄漏的输出(类似于:Detected memory leaks,后跟地址和内存转储)。

  3. 此外,在Visual Studio调试器(调试版本)中运行您的生成。有时在运行时会在输出窗口中看到关于泄漏,内存覆盖等的线索。请注意这些。他们提供宝贵的信息。一个干净的程序运行在Output窗口中将没有警告,ASSERTIONS,泄漏等。

如果你上传你的项目(&不会过于庞大)的地方,我会看看它。

勤奋和关注细节就是一切,在这里。

挂在那里!

+0

感谢@edtheprogrammerguy的回复。 从输出窗口我看到“f:\ dd \ vctools \ vc7libs \ ship \ atlmfc \ src \ mfc \ strcore.cpp(156):{1399129}在0x04EE0898的正常区块,长度为21个字节。 - 这条线10-20次没有。我认为这与CString有关,但无法找到究竟是哪个代码导致它。 以前有一些内存泄漏。我使用Visual Leak Detector解决了这些问题。但问题仍然存在。 –

+0

谢谢@edtheprogrammerguy .. 我有GDI句柄在ON_MOUSE_MOVE消息上的PreTranslateMessage函数中泄漏。 对于那些谁正面临similer问题参阅[链接](http://stackoverflow.com/questions/8302287/how-to-debug-gdi-object-leaks) & [链接](HTTP:// MSDN .microsoft.com/EN-US /库/窗/桌面/ ms724291(v = vs.85)的.aspx) –