我在Windows 7上的delphi程序(不适用于.NET)似乎连续运行了几天,然后程序冻结了所有的窗口都涂上了蓝灰色,就像它的窗口被禁用一样。您根本无法控制程序,但必须终止其进程并再次启动它。您无需重启系统本身。
有没有人遇到这种或类似的东西?如果是这样,你做了什么来解决或尝试解决它?
谢谢,
答案 0 :(得分:4)
您的问题背景非常模糊。我们没有任何关于您的应用程序的信息,甚至是它的设计和架构。
尽管如此,我的(通用)建议如下:
Synchronize
调用进行的; 我的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,请参阅项目选项 - >编译器 - >联。