为什么我的Windows程序会因其冷冻(蓝灰色)窗体或窗口而死?

时间:2011-10-26 19:27:59

标签: windows delphi win32-process

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

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

谢谢,

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

是的我在过去几年中解决了几个问题和其他问题。

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

所以我制作了自己的工具:-) 它是“AsmProfiler Sampling”工具的一部分: http://code.google.com/p/asmprofiler/downloads/detailname=AsmProfiler_Sampling%20v1.0.7.13.zip 单击first screen中的“处理堆栈视图”按钮。 然后从列表中选择您的进程并双击它: http://code.google.com/p/asmprofiler/wiki/ProcessStackViewer

现在您可以查看每个线程的堆栈跟踪。如果GUI没有响应,主线程挂起,所以检查第一个线程。 (注意:有时你会看到一个“emtpy”堆栈,因为函数未对齐堆栈进行计算等,使用原始strack跟踪算法再次获得更多的完整堆栈(带有大量误报,因为堆栈上的每个指针都是可能显示一个功能!))。
如果你不能解决它,请在这里发布堆栈,所以我们可以看看它。

注意:它使用JEDI库的jclDebug.pas单元,因此它可以读取.map和.jdbg文件(也是.ddb的.dbg和.pdb调试文件)以及内部JCLDEBUG部分(嵌入式.jdbg文件)在一个.exe)。因此,您必须至少使用详细的(!)映射文件构建.exe,请参阅项目选项 - >编译器 - >联。