|
|
1
11
使用madexcept,您可以指定定期检查主线程,使其仍能处理消息(使用变量超时,您可以将其设置为比最长操作要高的值)。如果主线程挂起,则可以获得堆栈跟踪。 见 Main thread freeze checking... 我已经成功地使用了它,它只有在挂在驱动程序中时才会失败(这可能是意料之中的)。在开始怀疑驱动程序(对于A/D转换卡)之后,我在每次API调用之前和之后添加了跟踪消息,并且能够证明驱动程序是罪魁祸首。请注意,为了获得可靠的日志数据,必须立即将消息写入文件并刷新缓冲区。 我也成功地使用了 WinDbg 在没有安装Delphi的系统上附加挂起的可执行文件。结果证明,这是一个死锁,因为不总是以相同的顺序获取关键部分。windbg通过检查线程堆栈和关键部分的状态来帮助分析这种情况。 |
|
|
2
4
为此,我使用了一个“看门狗”线程,它检查主窗体是否响应,并进行小型转储(可以使用windbg加载此转储,使用map2dbg.exe将delphi.map转换为.dbg)。
但你也可以用
为此(不需要windbg等,只需要jcl+delphi.map)
第三种选择是使用我的新
sampling profiler
它有一个“进程堆栈查看器”,因此您可以查看正在运行的进程的任何线程的堆栈(我以前为此使用过SysInternals进程浏览器,但它需要.dbg文件)。它使用.map、td32、jdbg等(任何delphi调试信息)进行堆栈跟踪。
Windows API(用于MiniDumpWriteDump):
|