我有一个我提供支持的 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)
. 虽然许多库确实驻留在同一个文件夹中,但它们都已注册。