我在 Windows 7 上的 delphi 程序(不适用于 .NET)似乎连续运行了几天,然后程序有点冻结,所有窗口都涂成蓝灰色,好像它的窗口被禁用了。您根本无法再控制该程序,而必须终止其进程并重新启动它。您不需要重新启动系统本身。
有没有人经历过这个或类似的事情?如果是这样,您做了什么来解决或尝试解决它?
谢谢,
我在 Windows 7 上的 delphi 程序(不适用于 .NET)似乎连续运行了几天,然后程序有点冻结,所有窗口都涂成蓝灰色,好像它的窗口被禁用了。您根本无法再控制该程序,而必须终止其进程并重新启动它。您不需要重新启动系统本身。
有没有人经历过这个或类似的事情?如果是这样,您做了什么来解决或尝试解决它?
谢谢,
您的问题上下文非常模糊。我们没有关于您的应用程序的任何信息,甚至它的设计和架构。
尽管如此,我的(通用)建议如下:
Synchronize
调用进行的;我已经运行了几个月没有任何问题的 Delphi 应用程序。问题肯定出在应用程序代码中,而不是在 Delphi 架构中(它的 RTL 和 VCL 非常稳定)。
蓝灰色可能是默认的窗口颜色,这意味着窗口本身不再绘画。这与程序不再响应任何输入的其他症状一致。这意味着它不处理任何窗口消息。
最简单的调试方法是在调试器中运行程序,当它挂起时停止它并查看它在哪里。
如果您有内存泄漏,您最终可能会耗尽进程空间中的内存,并且程序可能无法正确响应该情况。检查任务管理器以查看它正在使用的内存量。
是的,我在过去几年修复了几个挂起和其他问题。
我之前使用过 ProcessExplorer(查看堆栈),但它需要 Microsoft 调试符号。而使用 Delphi,您只能创建一个 .map 文件。使用 map2dbg,我可以将 .map 转换为 .dbg,但这并不总是有效(注意:.dbg 已弃用,较新版本的 Microsoft 调试工具不再使用它们)。
所以我制作了自己的工具 :-) 它是“AsmProfiler 采样”工具的一部分:
http ://code.google.com/p/asmprofiler/downloads/detailname=AsmProfiler_Sampling%20v1.0.7.13.zip
点击“第一个屏幕中的“进程堆栈视图”按钮。然后从列表中选择您的进程并双击它:
http ://code.google.com/p/asmprofiler/wiki/ProcessStackViewer
现在您可以查看每个线程的堆栈跟踪。如果 GUI 没有响应,则主线程挂起,因此检查第一个线程。(注意:有时您会看到“emtpy”堆栈,因为函数未对齐堆栈以进行计算等,请使用原始轨迹跟踪算法再次获取更多完整堆栈(有很多误报,因为堆栈上的每个指针都是可能显示了一个功能!))。
如果您无法解决,请在此处发布堆栈,以便我们查看。
注意:它使用 JEDI 库的 jclDebug.pas 单元,因此它可以读取 .map 和 .jdbg 文件(也可以读取 Windows dll 的 .dbg 和 .pdb 调试文件)以及内部 JCLDEBUG 部分(将 .jdbg 文件嵌入到一个 .可执行程序)。因此,您必须至少构建一个带有详细 (!) 映射文件的 .exe,请参阅项目选项 -> 编译器 -> 链接。