代码之家  ›  专栏  ›  技术社区  ›  Vegar

应用程序在退出时冻结-如何调试?

  •  1
  • Vegar  · 技术社区  · 14 年前

    我们有一个由主机(exe)和许多包含gui等的模块(dll)组成的应用程序。

    我们如何才能找出应用程序冻结的原因?

    5 回复  |  直到 14 年前
        1
  •  9
  •   Michał Niklas    14 年前

    我想那个好的旧伐木对你有帮助。为每个单元添加一些日志记录 finalization ,将这样的日志记录添加到全局数据(数据库连接、全局配置等)的析构函数中。当然不要破坏logger对象。

    如果您的应用程序是多线程的,那么向工作线程添加一些日志记录,例如写入“[date]thread[name of class]working”,并每隔几秒钟写入一次(您可以使用一些调试模式)。当线程发现它应该终止时,还要添加日志记录。

    还可以使用一些系统实用程序,如ProcessMonitor、Handles、Process Explorer(全部由Sysinternals/Microsoft提供)。监视磁盘读/写、句柄计数、内存使用情况、网络连接。也许你的应用程序在退出时在磁盘上抛出一些大的结构?也许它分配了很多内存,必须释放它?

        2
  •  5
  •   Chris Thornton    14 年前

    EurekaLog MadExcept ,这可能会显示异常的位置,或者导致异常的内存泄漏的位置。这两个都是功能齐全的试用版的优秀工具。试试,买吧。好东西。

        3
  •  3
  •   Rob Kennedy    14 年前

    如果调试器的存在阻止了问题的发生,则等待问题发生,并且 然后 将调试器附加到它。暂停执行,可以检查每个线程的调用堆栈。

        4
  •  0
  •   Wim ten Brink    14 年前

    如果你在DLL中使用了大量的GUI组件和/或做了大量的多线程处理,那么你必须首先发现是哪个DLL或线程导致了这个问题。或者两者兼而有之。基本上,应该为加载/启动的每个DLL和线程创建日志事件。尝试获得这样一种情况:加载了最少的DLL和线程来生成冻结。然后你把问题定位到其中一个。
    Delphi version 属于 NUnit 有,可能会有帮助。(这叫 DUnit …)这样的测试框架有助于隔离线程和DLL来检查每个线程。

        5
  •  0
  •   APZ28    14 年前

    如果您的应用程序是在windows 7下运行的,并且有线程在DLL中运行,则必须关闭/终止所有正在运行的DLL线程,然后再关闭可执行文件的主窗体。