Delphi程序中的已删除组件

12

更新

2016-02-18: 添加了进程信息


我有一个使用XE4编译的Delphi程序。它被几百个客户使用。几周前,其中一位客户报告说,在一天中的某些时候,执行文件的某些区域(下面的图像)会随机擦除。这位客户有35个站点使用这个exe,但问题只出现在其中不超过10个站点。

调查

1 - 我最初怀疑是一个无限循环。执行文件在组件被擦除时仍然响应,代码从发生问题之前没有发生如此根本的变化,而日志中也没有显示任何循环(这个exe到处都有日志)。

2 - 线程表现不良。我有一个单独的线程,在这个exe和我们的云服务器之间同步数据。同样,日志不显示线程在问题发生时正在运行,而且这里也没有发生任何更改。

3 - 其他程序(杀毒软件?)影响了我的exe。还没有适当地调查这个假设,但到目前为止,我没有找到任何安装的程序引起我的注意。

我的问题是:可能是什么导致了这个问题?我该如何进一步调查?我知道这可能是一个广泛的问题,但这是我能够收集到的所有信息,我想不出还有更多可以查看的地方。

图像

1 - 在下面的图像中,红色描边区域应该是一个TToolBar

被擦除的 TToolBar

2 - 在这张第二张图中,有三个区域,从上到下,第一个应该是一个TToolBar,第二个应该是子窗体的标题,第三个应该是一个TwwDBGrid

菜单、标题和 TwwDBGrid 被擦除

3 - 第三个示例在顶部显示了应该有 TEdit 的被删除区域,它下面是应该在 TwwDBGrid 上的一条线,侧边还可以看到 TwwDBGrid 的被删除滚动条

Tedit、线和滚动条被擦除

4 - 这个最后一个示例展示了 5 个被删除的区域:应用程序的标题,主要的 TToolBar,窗体的标题,一个 TButton 和两个 TwwDBGrid

输入图像描述

5 - 这是一个有趣的示例,因为除了被删除的组件之外,还有 4 个 TSpeedButtons,但它们没有原来的图片(第一个红色划掉区域)。其他 3 个红色划掉区域分别是 2 个 TEdits、一个 TwwDBGrd 和一个 TButton

输入图像描述

进程信息

我在问题出现时获得了截图。scgolr 是我的软件。

输入图像描述


我的猜测是与显卡和驱动程序有关的问题。工具栏对这些东西特别敏感。 - David Heffernan
1
当表单显示时,组件丢失了吗?程序一直运行良好,突然所有新表单都开始失败了吗?也许您有一些内存或资源泄漏,并且正在耗尽某些Windows/GDI资源。请验证在关闭时是否正确释放了表单。 - JRL
2
您已经在任务管理器中打开了“进程”选项卡,请使用“视图”(Exibir)->“选择列”选择“GDI 对象”和“用户对象”这两列。按照这些列进行排序,查看是否存在过度使用这些对象的情况。 - Sebastian Z
5
您的程序被几百个客户使用。其中一个客户在不到三分之一的站点上遇到了问题。由于该问题非常明显且会影响工作流程,如果这是一个普遍问题,我相信其他客户也会联系您。因此,关键原因应该可以在出现问题的那些站点找到。此外,该问题发生在今年年初(约几周前)的一个相当特定的时间范围内。我认为第一步应该澄清那时发生了什么变化? - Tom Brunberg
2
硬件、网络、服务器、操作系统、其他软件。别忘了,还有你的软件是如何使用的。实际上,任何在那个时候发生过变化的东西都要检查一下。需要检查的清单很长,目的是找到那些出现问题的几个站点的共同变化?这种变化本身可能会成为实际原因(例如不兼容的硬件),也可能只是触发了你的软件中的弱点。一旦知道了问题的根源,就可以大大减少搜索的范围。 - Tom Brunberg
显示剩余22条评论
3个回答

2
没有足够详细的信息可以给您一个明确的答案。但是,我可以就您的问题给出一些指导方向:
由于您提到以下事实: - 该程序由几百个客户使用 - 只有一个客户遇到了问题 - 问题首次出现已经几周了
那么,第一件要做的事情是联系客户,并获得您所要求但未获得的信息。需要回答的问题包括: - 在问题开始时,客户环境中的硬件、网络、服务器、操作系统、在PC上运行的其他软件等方面发生了什么变化? - 您的客户是否更改了使用您软件的方式? - 客户需要做什么才能摆脱问题?关闭程序?重新启动PC?还是只需最小化 - 恢复错误窗口?
以上并不意味着问题出在这个客户及其设备或使用软件的方式上。可能只是该站点与所有其他客户不同的组合触发了问题的出现。
在问题发生时和如果问题通过最小化 - 恢复应用程序消失(这表明是绘画中断问题)时,在您的软件和站点中检查一些特定的事项: - 您是否随时调用Application.ProcessMessages? - 后台线程是否访问与GUI相同的数据?如果是,数据保护是否正确(锁定、同步)。 - 后台线程是否没有使用Synchronize访问任何GUI组件?
最后,我建议您亲自拜访客户。直接交流可以更快、更好地得到答案。
在收到处理信息后进行编辑:
关于GDI或User对象,没有什么可警惕的。但是,当您在评论中表示在许多位置调用Application.ProcessMessages时,显然是为了“修复”无响应的UI时,这是令人担忧的。例如,如果用户双击按钮,但速度足够慢,以至于Windows将其检测为两个单独的点击,会发生什么?第一次点击可能会启动您持续很长时间的过程,在其中您调用A.P.第二次点击从消息队列中读取,启动相同的过程。现在,该过程的第二次调用(带有自己对A.P.的调用)最终结束,执行返回到第一次调用。根据您在此过程中所做的操作,您可能会搞乱句柄和设备上下文等等。强烈建议并带着友好的意图说:摆脱那些对A.P.的调用。

我终于通过GDI信息获取了进程信息...已添加到问题中。 - Ricardo Acras
我在许多长时间运行的代码处调用Application.ProcessMessages。 - Ricardo Acras
@Ricardo,这不好!你需要删除那些A.P.调用。 - Tom Brunberg
@Ricardo 这里有一篇值得阅读的链接,还有这里 - Tom Brunberg
谢谢Tom Brunberg!我深入研究了一下,实际上我在软件中只有不到10个地方使用ProcessMessages。但我真的不知道这个问题,现在它完全有意义了。@Passella的答案解决了问题,但根据您的评论,我已经开始重构,将使用ProcessMessages的地方改为Threads。 - Ricardo Acras

1

问题出在安全插件(华沙- Gas Tecnologia)上,是您的客户正在访问的银行网站存在问题,更新插件即可解决,该问题发生在巴西。


我知道Gas Tecnologia的任何软件都有问题,但你确定它会导致这些组件被删除的问题吗? - Ricardo Acras
这个问题已经在我们的客户那里出现了。http://www.reclameaqui.com.br/14363141/gas-tecnologia-a-diebold-company/gas-tecnologia-interferindo-em-sistemas-desenvolvidos-em-del/ - Passella
1
这确实是问题所在。为了让其他人看到Gas Technologia软件可能会引起什么样的麻烦,请查看http://www.linhadefensiva.com/2013/04/brazilian-users-unable-to-boot-windows-after-botched-update/。 - Ricardo Acras

1
如@SebastianZ和@AlekseyK所指出的那样,您可能会遇到一些GDI资源(句柄)的耗尽问题。如果可以访问系统,像Process Explorer或Process Hacker这样的工具可能会给您一些提示。这个实用程序也可能有所帮助 GDIView 我不知道这是否适用于您的情况,但有时数据库数据损坏可能会导致运行程序出现奇怪的效果(我记得“数据炸弹”会导致内存异常...)
因此,如果某些东西导致GDI分配循环,您应用程序的图形可能会以“奇怪”的方式受到影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接