如何在Delphi应用程序中调试挂主线程

Har*_*riv 2 delphi debugging hang thread-safety

我在Delphi 2007中编写了应用程序,有时会挂起(甚至不是每周都有应用程序全天候运行).看起来主线程卡住了.有哪些方法可以找出导致此问题的原因?

应用程序是用Delphi 2007编写的,它使用RemObjects,DBExpress和Firebird,使用COM进行OPC通信.

mgh*_*hie 11

使用MadExcept,您可以指定定期检查主线程以仍处理消息(使用变量超时,您将设置为高于最长操作所需的值).如果主线程挂起,则可以获得堆栈跟踪.

请参阅主线程冻结检查...

我已经使用了这个并取得了一些成功,但只有当挂起在驱动程序中时才会失败(这可能是预期的).在开始怀疑驱动程序(对于A/D转换卡)之后,我在每个API调用之前和之后添加了跟踪消息,并且能够证明驱动程序是罪魁祸首.请注意,立即将消息写入文件并刷新缓冲区以获取可靠的日志数据非常重要.

我还成功地使用WinDbg附加到没有安装Delphi的系统上的挂起可执行文件.事实证明,这并不总是以相同的顺序获取关键部分.WinDbg通过检查线程堆栈和关键部分的状态来帮助分析这种情况.