2

我有一个我提供支持的 VB6 应用程序。此应用程序适用于 Windows XP 和 Windows 7。使用用户状态迁移工具将一些用户从 Windows XP 迁移到 Windows 7。这些用户现在在应用程序中打开某些屏幕(表单)时会收到一般的“应用程序已崩溃”Windows 错误消息。我的假设是缺少 dll/ocx 引用,但我无法追踪它。

我尝试了许多/不同的故障排除技术:

  • 完全卸载并重新安装我的应用程序
  • 手动重新注册我知道使用的所有 dll 和 ocx
  • 在损坏的计算机和正常工作的计算机上运行进程监视器以​​比较访问的 dll 和 ocx。答案可能就在这里,但即使在过滤掉大部分背景噪音之后,数据量仍然是压倒性的。至少我在它崩溃之前检查了所有的调用以及所有不成功的调用。所有不成功的调用都在工作和非工作之间匹配。
  • 安装了 Windows 调试器工具并捕获了故障转储。使用 DebugDiag 分析故障转储。DebugDiag 说异常在 msvbvm60.dll 中。我尝试为我的 exe 构建一个 PDB 文件并将其加载到 DebugDiag 中以获取有关异常发生位置的更多详细信息,但 DebugDiag 不想接受 PDB(可能在这里做错了,但它似乎忽略了它。但是,当我进行远程调试时,这个相同的 PDB 文件可以正常工作。)
  • 我重新编译了我的 VB6 程序,没有在 PCCode 中进行任何优化。我在网上读到,有时在 PCCode 中构建,虽然对性能不利,但会告诉你真正的例外。
  • 使用上面创建的 PDB 文件远程调试 VB6 应用程序。调试器说应用程序在创建新窗口后崩溃,在一行设置MousePointer = vbHourGlass...对我来说,这似乎不太可能是错误的真正原因。程序中至少有 20 个其他位置调用了同一行并且一切正常。(忘记这个了
  • 使用 Dependency Walker 并在工作和非工作计算机上分析应用程序。依赖 walker 发现的所有错误在两台计算机之间都是相同的。在工作计算机上没有发现其他依赖项,并且在非工作计算机上缺少的所有依赖项也在工作计算机上丢失。

这些操作都没有改变我的错误消息或向我显示错误是什么(除非它确实是鼠标光标问题)...... Windows 事件日志中没有与应用程序崩溃相关的条目。

非工作计算机和工作计算机都具有相同的基本 Windows 7 映像,唯一的区别是 USMT 更改了什么,这进一步让我相信这是某种古怪的配置更改或缺少 dll/ocx 或者可能是未注册的dll/ocx.

任何关于如何追查问题根源的想法或想法将不胜感激。

更新 1 - 对
@MarkHall 问题的回答我尝试以管理员身份运行它,但没有关闭 UAC。该应用程序以具有完整 UAC 的非管理员身份在 Windows 7 机器上运行良好。Windows XP 是 32 位的,Windows 7 是 64 位的,但它同样适用于用户未从 Windows XP 迁移的类似框。

@Beaner它可能将设置存储在已损坏的某处,但是远程调试使我认为它更有可能是其他东西,因为它似乎在与UI相关的步骤上死了,这让我认为它可能是丢失的dll/ocx 参考。

@Bob77 该应用程序已安装到Program Files (x86). 虽然许多库确实驻留在同一个文件夹中,但它们都已注册。

4

1 回答 1

2

彼得,我经常注意到调试器会指示一行实际上不正确的代码,具体取决于实际汇编语言中发生错误的位置。您应该在将光标设置为vbHourGlass. 您的异常可能发生在该代码行之前,但该行是调试器认为的实际错误代码行。

既然你说它发生在窗口打开时,我会仔细查看你可能在表单上引用的任何 ocx,但实际上可能没有被使用或调用。你可能有一个你不打算在那里的,这可能会导致安全问题,或者在 Win7 上?如果需要,手动编辑 .frm 文件,并查看表单引用的所有 GUID。

有可能一台机器正在使用 PER-USER 注册,而另一台机器正在使用 PER-SYSTEM 注册?我不知道...

我会更仔细地查看您尝试打开的表单,并对您在表单加载事件中所做的一切非常谨慎,等等。这听起来可能像在一个系统上启用 Windows Aero 一样愚蠢,而不是在另一个系统上启用,或者某些其他类型的“主题”设置将 VB 表单渲染例程扔进一个嘶嘶声......甚至可能是愚蠢的东西作为您从中选择的图标中的透明颜色索引?

如果您仍在开发此应用程序(或至少维护它),请创建一个全新的表单,并在表单上重新创建所有控件等(抵制从旧表单复制/粘贴它们的诱惑...... .),然后看看这是否有效。然后,一次将所有事件代码复制到新表单一个事件,至少有足够的事件代码来使表单功能,即使它只是一个“死表单”,不加载任何数据,或者任何形式的假设去做。每次更改后检查和调试,您最终会找到它。当然,请确保您隔离其中一个已失效的系统,以便拥有一个可以在其上复制问题的平台,否则它只是猜测。我发现使用带有异机还原的 Acronis 之类的东西是一个很好的选择,可以将图像文件放入一个好的 HV,比如 VirtualBox,然后将该映像还原为 VM,这样您就可以在不干扰实际用户的情况下进行调试。这听起来像是很多工作,但话说回来,重新编写一个已经存在的应用程序也是如此,对吧?:)

失败了...... /*并且*/是你的朋友!(好吧,我们正在处理 VB,所以'会是你最好的朋友!呵呵......但我会开始注释掉表单上的所有代码,直到那个吸盘打开。然后一旦它打开,开始放一行回到一次,然后重新运行它......这就是所谓的“VooDoo 调试”,但有时,你必须做你必须做的......

非常感谢彼得!:) 现在你让参与其中,我觉得是调试这个傻瓜的人!就像我试图修复的代码一样!:)

让我知道这是否有帮助...我实际上对您的发现很感兴趣。

于 2013-12-06T07:15:12.650 回答