C++ VS2010 C++;调试问题-调试和应用程序的高级方法?

C++ VS2010 C++;调试问题-调试和应用程序的高级方法?,c++,visual-studio-2010,memory-leaks,mfc,C++,Visual Studio 2010,Memory Leaks,Mfc,我们有一个很难调试的程序。MFC应用程序可以正常运行几个小时,但一天之后就会崩溃。有时它不会抛出任何错误,只需退出代码的“dlg.DoModal()”部分,而用户(或代码的任何明显部分)都不会关闭对话框。其他时候,它会崩溃,并在我们的代码之外抛出一个错误,并且有一个与我们的代码无关的可怕的调用堆栈,但是它有很多对系统DLL的调用 关于我们问题的一点背景知识 我们正在尝试开发一个MFC基础C++应用程序(带有对话框)。我们有多个线程,代码相当大,这使得调试成为一场噩梦。我们一直在经历间歇性的车祸

我们有一个很难调试的程序。MFC应用程序可以正常运行几个小时,但一天之后就会崩溃。有时它不会抛出任何错误,只需退出代码的“dlg.DoModal()”部分,而用户(或代码的任何明显部分)都不会关闭对话框。其他时候,它会崩溃,并在我们的代码之外抛出一个错误,并且有一个与我们的代码无关的可怕的调用堆栈,但是它有很多对系统DLL的调用

关于我们问题的一点背景知识

  • 我们正在尝试开发一个MFC基础C++应用程序(带有对话框)。我们有多个线程,代码相当大,这使得调试成为一场噩梦。我们一直在经历间歇性的车祸,到目前为止,我们还无法找到车祸的源头
我们已经不再使用断点进行调试了,因为我们非常确定这是MFC中的一个问题,可能不是一个bug,而是我们使用MFC的方式的一个问题

现在我们尝试了一些简单的方法来帮助我们,比如:

  • 启用所有调试异常:

    调试->异常,然后选中所有框,以便 圈套愚蠢的错误

    这被证明是有帮助的,但是我们现在已经纠正了它抛出的所有错误 在运行的几个小时内

  • 搜索内存泄漏

    然后,我们尝试了可视检漏仪(由 方法)位于此处:我们的代码现在报告没有 内存泄漏,因此这不是一个明显的内存泄漏问题。我们有 将vld.h包含在入口点附近的代码顶部

  • 正在添加Microsoft Symbol Server以获取调试符号文件

    然后,我们尝试使用MS使我们的调用堆栈更具可读性 这些教程中显示的符号服务器: 及

    这最终没有起到任何作用,因为它仍然没有告诉您关于任何错误的足够信息

  • 使用线程窗口查看所有调用堆栈,并使用 并行堆栈窗口

    我们一直在使用线程和并行堆栈窗口来帮助 但最终证明它们只不过是漂亮而已 图片和格式奇特的呼叫堆栈,让您感觉良好 最重要的是。我们一直在这里使用教程,它 非常方便

现在,我们尝试了一些更有趣的事情,它们不会立即抛出错误,但可以检测为问题:

  • 未销毁的GDI对象

    这个问题在VS2010中并不明显。基本上,如果您使用像“CDC*pDC=lChild->GetDC();”这样的调用,而不使用“ReleaseDC(pDC);”这样的调用,那么您刚刚创建了一个GDI对象,它在程序终止之前不会被销毁。VS2010在这方面有点笨,它会一直创建这些对象,直到你的程序崩溃,调用堆栈看起来很糟糕,你可能不知道它为什么会崩溃

    要查找此问题,请启动Windows任务管理器->单击“进程”选项卡->单击“查看”工具栏项目->选择列。现在检查句柄、线程、用户对象和GDI对象。现在启动您的程序,在Image Name下的列表中找到它的进程,并观察GDI Objects列是否保持增长或稳定

  • 未被销毁的物品

    这是另一个不太明显的错误,如果您创建这样的位图:“reinterpret_cast(LoadImage(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAPNPR),IMAGE_bitmap,0,0)),并直接将其分配给图片控件,则如果使用类似代码将另一个位图分配给该图片控件,则不会销毁位图。相反,您需要将上述内容分配给一个HBITMAP变量,完成后需要销毁该变量

    如果您以类似的方式创建字体或颜色,也会出现这种情况

尽管如此,我们已经尝试了上述所有方法,但仍然找不到问题。有时我们的程序会正常退出,我们不会得到任何调试信息(这通常是在is运行了一夜之后),有时我们的程序会锁定PC(在多台PC上测试),有时它会抛出错误,但我们无法找到罪魁祸首,因为它只是指向“.DoModal()”我们的代码的一部分和其余部分是本机windows DLL,这对于调试是无用的

我们怀疑某些东西正在被创建,但我们不确定是什么,VS2010也没有告诉我们任何有用的东西,为我们指明正确的方向

有人有什么想法吗?我们如何捕获对VS2010不明显的错误?或者更确切地说,我们如何轻松捕获“GDI泄漏”之类的漏洞

提前谢谢

编辑:


我们一直在使用微软的应用验证程序,到目前为止发现了一些错误。要使用它,请在此处下载并运行应用程序验证程序,将.exe文件添加到调试或发布目录中,然后在VS2010中正常运行该程序。当应用程序验证程序“看到”错误时,VS2010将中断。它还没有发现任何太离谱的东西,所以我认为我们的代码仍然存在问题。

您在任何地方使用COM吗?尤其是访问COM服务器,您可能无法控制它的生命周期(因为用户可以在TaskMgr中终止此类进程)?跟踪此类错误非常困难和耗时,而且(据我所知)没有明确的答案。根据您编写的内容,我想说您的程序破坏了堆(除了错误地管理资源之外)。你可以试着从这里开始阅读:我可以找到“CComModule”、“namespace”(当然除了STD)、“CoInitialize”或“import”的任何引用,所以我假设我们在任何地方都不使用COM。这并不是说我们正在使用的某个库没有使用它。如果我们丢失了一个COM服务器,我们如何检测/捕获?感谢提供信息xxbbcc!我会查看链接并获得ba