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

时间:2014-05-12 02:27:25

标签: c++ visual-studio-2010 memory-leaks mfc

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

我们问题的一些背景知识。

  • 我们正在尝试开发一个MFC基础C ++应用程序(带有对话框)。我们有多个线程,代码相当大,这使得调试成为一场噩梦。我们一直在经历间歇性的崩溃,我们无法找到目前为止的来源。

我们已经远远超过了使用断点进行调试,因为我们非常确定它是MFC中的某个问题,可能不是错误,但更多的是我们使用MFC的问题。

现在我们尝试过简单的事情来帮助我们:

现在我们尝试过更有趣的事情,不要立即抛出错误,但可以将其检测为问题:

  • 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将会中断。一个错误。它还没有找到任何过于离谱的东西,所以我认为我们的代码仍然存在问题。

0 个答案:

没有答案