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

时间:2010-11-08 09:46:16

标签: delphi freeze

我们有一个由主机(exe)和许多包含gui等的模块(dll)组成的应用程序。 有时,应用程序会在关机时冻结。大多数情况下,它通过TestComplete进行测试。我们无法在调试期间重现该行为。

我们怎样才能找出申请冻结的原因?

我猜它与线程有关,但我不确定。

我们应该尝试一些工具或技术吗?

5 个答案:

答案 0 :(得分:9)

我认为好的旧伐木会对你有所帮助。向每个单元finalization添加一些日志记录,将此类日志记录添加到全局数据的析构函数(数据库连接,全局配置等)。当然不要破坏记录器对象。

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

还可以使用一些系统实用程序,例如ProcessMonitor,Handles,Process Explorer(全部由Sysinternals / Microsoft提供)。监视磁盘读/写,处理计数,内存使用情况,网络连接。也许您的应用程序在退出时将一些大型结构转储到磁盘上?也许它分配了大量内存并且必须释放它?

答案 1 :(得分:5)

使用EurekaLogMadExcept进行装配,这可能会显示异常的位置,或导致异常的内存泄漏位置。这两个都是具有全功能试用版的优秀工具。试试吧,买吧。好东西。

答案 2 :(得分:3)

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

答案 3 :(得分:0)

如果在DLL中使用大量GUI组件和/或进行大量多线程,那么首先必须发现导致问题的DLL或线程。或者它可能是两者的结合。基本上,您应该为每个加载/启动的DLL和线程创建日志事件。尝试获得最少加载DLL和线程以生成冻结的情况。然后,您已将问题本地化为其中之一。
另外,创建简单的测试应用程序或使用单元测试框架来测试特定模块。例如,有Delphi version NUnit可用,这可能会有所帮助。 (它被称为DUnit ...)这样的测试框架有助于隔离线程和DLL以检查它们中的每一个。

答案 4 :(得分:0)

如果您的应用程序在Windows 7下运行并且在DLL中运行了线程,则必须在关闭可执行文件的主要形式之前关闭/终止所有正在运行的DLL线程。

祝你好运