为什么我的Windows程序死于冻结(蓝灰色)窗体或窗口?

我在Windows 7上的delphi程序(不适用于.NET)似乎是连续运行了几天,然后程序就会冻结,所有的窗口都涂上蓝灰色,好像它的窗口被禁用了一样。 你根本无法控制程序,但必须杀死它的进程并重新启动它。 您不需要重新启动系统本身。

有没有人遇到这个或类似的东西? 如果是这样,你做了什么来解决或试图解决它?

谢谢,

Solutions Collecting From Web of "为什么我的Windows程序死于冻结(蓝灰色)窗体或窗口?"

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

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

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

你的问题背景是非常模糊的。 我们没有任何关于您的应用程序的信息,甚至是其设计和架构。

无论如何,我的(通用)建议如下:

  • 如果您的应用程序不是多线程的,则在后台线程中执行该进程,然后让主线程准备好处理GDI消息;
  • 如果您的应用程序是多线程的,请注意所有来自后台线程的VCL访问均通过Synchronize调用完成;
  • 如果您的应用程序是多线程的或使用定时器,请注意不要使用任何方法(在某些情况下,您可能会遇到竞争状况 )。
  • 狩猎任何内存泄漏;
  • 使用程序执行的详细记录, 记录所有异常上升,猜测程序挂起的上下文(它也可以在客户端用于捕捉竞争条件);
  • 下载名为ProcessExplorer的优秀免费工具(现在由Microsoft托管),并查看冻结程序的状态:您将看到关于线程,CPU使用,内存,网络,库,句柄的详细信息 – 这是必须的严重的调试 – 特别是跟踪GDI处理泄漏(这些数字应该保持稳定);
  • 如果你没有检查它,看看全球的Windows系统事件日志:这里可能有一些信息;
  • 也许第三方组件或库对进程挂起负责:尝试隔离可能对此挂起负责的代码部分。

我有Delphi应用程序运行几个月没有任何问题。 问题在应用程序代码中是确定的,而不是在Delphi体系结构中(它的RTL和VCL非常稳定)。

是的,我在过去几年里确定了几个问题和其他问题。

我之前使用ProcessExplorer(查看堆栈),但它需要Microsoft调试符号。 而用Delphi你只能创建一个.map文件。 使用map2dbg,我可以将.map转换为.dbg,但这并不总是奏效(注意:.dbg已被弃用,新版本的微软调试工具不再使用它们)。

所以我做了我自己的工具:-)它是“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”堆栈,因为一个函数没有对堆栈进行计算等等,使用原始的strack跟踪算法来再次获得更多的堆栈(有很多误报,因为堆栈中的每个指针都是可能的功能显示!))。
如果你不能解决这个问题,请在这里发布,所以我们可以看看它。

注意:它使用JEDI库的jclDebug.pas单元,因此它可以读取.dll和.jdbg文件(也包括Windows dll的.dbg和.pdb调试文件)以及内部的JCLDEBUG节(嵌入的.jdbg文件)。可执行程序)。 所以你至少必须建立一个具有详细(!)映射文件的.exe文件,参见Project Options – > Compiler – > Linking。