1

我在 Windows 7 上的 delphi 程序(不适用于 .NET)似乎连续运行了几天,然后程序有点冻结,所有窗口都涂成蓝灰色,好像它的窗口被禁用了。您根本无法再控制该程序,而必须终止其进程并重新启动它。您不需要重新启动系统本身。

有没有人经历过这个或类似的事情?如果是这样,您做了什么来解决或尝试解决它?

谢谢,

4

3 回答 3

4

您的问题上下文非常模糊。我们没有关于您的应用程序的任何信息,甚至它的设计和架构。

尽管如此,我的(通用)建议如下:

  • 如果您的应用程序不是多线程的,请在后台线程中执行处理,然后让主线程准备好处理 GDI 消息;
  • 如果您的应用程序是多线程的,请注意后台线程的所有 VCL 访问都是通过Synchronize调用进行的;
  • 如果您的应用程序是多线程的或使用计时器,请注意没有方法是可重入的(在某些情况下,您可能会遇到竞争条件);
  • 寻找任何内存泄漏;
  • 使用程序执行的详细日志,记录所有出现的异常,以猜测程序挂起的上下文(它可能在客户端也用于寻找竞争条件);
  • 下载名为ProcessExplorer (现在由 Microsoft 托管)的伟大免费工具,并检查冻结程序的状态:您将看到有关线程、CPU 使用、内存、网络、库、句柄的详细信息 - 这是任何人都必须拥有的认真调试 - 跟踪特别是GDI 处理泄漏(其中的数量应保持稳定);
  • 如果您还没有检查,请查看全局 Windows 系统事件日志:这里可能有一些信息;
  • 也许第三方组件或库负责进程挂起:尝试隔离可能导致此挂起的代码部分。

我已经运行了几个月没有任何问题的 Delphi 应用程序。问题肯定出在应用程序代码中,而不是在 Delphi 架构中(它的 RTL 和 VCL 非常稳定)。

于 2011-10-27T06:03:17.010 回答
2

蓝灰色可能是默认的窗口颜色,这意味着窗口本身不再绘画。这与程序不再响应任何输入的其他症状一致。这意味着它不处理任何窗口消息。

最简单的调试方法是在调试器中运行程序,当它挂起时停止它并查看它在哪里。

如果您有内存泄漏,您最终可能会耗尽进程空间中的内存,并且程序可能无法正确响应该情况。检查任务管理器以查看它正在使用的内存量。

于 2011-10-26T19:34:00.010 回答
0

是的,我在过去几年修复了几个挂起和其他问题。

我之前使用过 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,请参阅项目选项 -> 编译器 -> 链接。

于 2011-10-27T08:00:02.130 回答