我们有一个证明难以调试的程序。 MFC应用程序可以正常运行几个小时,但一天之后就会崩溃。有时它不会抛出任何错误,只需退出" dlg.DoModal()"我们的代码部分没有用户(或任何明显的代码部分)关闭对话框。其他时候它会崩溃并在我们的代码之外抛出一个错误,并且有一个与我们的代码无关的可怕的调用堆栈,但是它有很多对系统DLL的调用。
我们问题的一些背景知识。
我们已经远远超过了使用断点进行调试,因为我们非常确定它是MFC中的某个问题,可能不是错误,但更多的是我们使用MFC的问题。
现在我们尝试过简单的事情来帮助我们:
启用所有调试例外:
调试 - >例外,然后检查所有框,以便我们可以 陷阱愚蠢的错误。
这证明是有帮助的,但我们现在已经纠正了它抛出的所有错误 在跑步的几个小时内。
搜索内存泄漏
然后我们尝试了Visual Leak Detector(它的工作效果非常好 方式)位于此处:http://vld.codeplex.com/我们的代码现在报告否 内存泄漏所以它不是一个明显的内存泄漏问题。我们有 在入口点附近的代码的最顶部包含了vld.h。
添加Microsoft Symbol Server以获取调试符号文件。
然后,我们尝试使用MS使我们的调用堆栈更具人性化 这些教程中显示的符号服务器: http://social.msdn.microsoft.com/Forums/vstudio/en-US/3f1825e1-6770-48c0-91b0-12d8946ab259/2-how-do-i-configure-visual-studio-to-use-microsoft-symbol-server?forum=vsdebug和http://support.microsoft.com/kb/311503
这最终没有做任何事情,因为它仍然没有告诉你任何错误。
使用Thread窗口查看所有调用堆栈,并使用 并行堆栈窗口
我们一直在使用Thread和Parallel堆栈窗口来帮助我们 调试,但最终他们证明只是漂亮 图片和精心格式化的调用堆栈,让您感觉良好 比什么都重要。我们一直在使用这里的教程 非常方便 http://www.codeproject.com/Articles/79508/Mastering-Debugging-in-Visual-Studio-A-Beginn
现在我们尝试过更有趣的事情,不要立即抛出错误,但可以将其检测为问题:
GDI对象未被销毁
这个问题在VS2010中并不明显。基本上,如果您使用像" CDC * pDC = lChild-> GetDC();"并且不要使用呼叫" ReleaseDC(pDC);"然后你刚刚创建了一个GDI对象,在你的程序终止之前不会被销毁。 VS2010在这方面有点愚蠢,并且会继续创建这些对象,直到你的程序崩溃,并且调用堆栈看起来很糟糕,你可能不知道它为什么会崩溃。
要查找此问题,请启动Windows任务管理器 - >点击进程标签 - >单击“查看工具栏”项 - >选择列。现在检查句柄,线程,用户对象和GDI对象。现在启动程序,在“映像名称”下的列表中找到它的进程,并观察GDI对象列是否保持增长或稳定。
对象未被销毁
这是另一个不那么明显的错误,如果您创建这样的位图:" reinterpret_cast(LoadImage(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAPNPR),IMAGE_BITMAP,0,0,0))"并将其直接分配给图片控件,如果使用类似的代码将另一个位图分配给此图片控件,则不会销毁位图。相反,您需要将上述内容分配给HBITMAP变量,然后在完成后需要销毁该变量。
如果以类似方式创建字体或颜色,也会出现这种情况。
现在谈到所有这些,我们已经尝试了上述所有方法,但我们仍然无法找到问题。有时我们的程序会正常退出,我们不会得到任何调试信息(这通常是在隔夜运行之后),有时我们的程序将锁定PC(在多台PC上测试),有时它会抛出错误,但我们无法找到罪魁祸首,因为它只是指向" .DoModal()"我们的代码的一部分,其余的是本机的Windows DLL,这对于调试目的是无用的。
我们怀疑某些事情正在被创造并且没有被正确销毁,但我们不确定是什么,并且VS2010没有告诉我们任何有用的信息指向我们正确的方向。
有没有人有任何想法?我们如何捕获对VS2010来说不明显的错误?或者更确切地说,我们如何容易地陷入" GDI泄漏"之类的?
提前致谢
编辑:
我们一直在使用微软的应用验证程序,到目前为止发现了一些错误。要使用它,请在此处下载http://www.microsoft.com/en-us/download/details.aspx?id=20028运行Application Verifier,将您的.exe文件添加到Debug或Release目录中,并正常运行VS2010中的程序。当Application Verifier看到'时,VS2010将会中断。一个错误。它还没有找到任何过于离谱的东西,所以我认为我们的代码仍然存在问题。