XP到Win7升级后对VB6应用程序崩溃的故障排除

时间:2013-01-10 15:50:14

标签: debugging windows-7 vb6 remote-debugging

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

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

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

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

非工作和工作的计算机都具有相同的基本Windows 7映像,唯一的区别是USMT正在更改的内容,这进一步说服我这是某种奇怪的配置更改或缺少dll / ocx或也许是未注册的dll / ocx。

我将非常感谢任何有关如何追查问题根源的想法或想法。

更新1 - 回答问题
@MarkHall我已尝试以管理员身份运行它,但不是关闭UAC。该应用程序在Windows 7机箱上运行良好,作为非管理员使用完整的UAC。 Windows XP是32位,Windows 7是64位,但它再次适用于类似于用户未从Windows XP迁移的类似框。

@Baaner它可能会将设置存储在已损坏的地方,但是远程调试让我认为它更可能是其他东西,因为它似乎死于与UI相关的步骤,这让我觉得它是可能缺少dll / ocx参考。

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

1 个答案:

答案 0 :(得分:2)

Peter,我经常注意到调试器会指示一行实际上不正确的代码,具体取决于发生故障的实际汇编语言中的WHERE。您应该在将语句设置为vbHourGlass的语句旁边看起来很接近。您的例外是在该行代码之前发生的,但该行是调试器认为是实际出现故障的代码行。

因为你说它发生在一个窗口OPENS时,我看起来真的很接近你可能在表单上引用的任何ocx,但可能实际上并没有被使用或被调用。你可能有一个你不打算在那里,可能会导致安全问题,或Win7上的东西?如果必要,手动编辑.frm文件,并查看表单引用的所有GUID。

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

我会仔细查看您尝试打开的表单,并非常谨慎地处理表单加载事件中的所有操作,依此类推。这听起来像是一个愚蠢的东西,如在一个系统上启用Windows Aero,而不是另一个,或其他一些“主题”设置,将VB表单渲染例程抛入一个hissyfit ...也许甚至像愚蠢的东西作为您选择的图标中的透明颜色索引?

如果您仍在开发此应用程序(或至少维护它),请创建一个完全新的表单,并在表单上重新创建所有控件等(抵制从旧版本复制/粘贴它们的诱惑一个...),然后看看是否有诀窍。然后,将所有事件代码一次复制到新表单一个事件,使用至少足够的事件代码来创建表单函数,即使它只是一个“死表单”,不加载任何数据,或者不管表单是什么形式去做。每次更改后检查并调试,最终会找到它。当然,请确保您将其中一个已解散的系统隔离开来,以便拥有一个可以复制问题的平台,或者只是猜测它。我发现使用Acronis w / Universal Restore之类的东西是一个很好的选择,然后将图像文件转换为一个好的HV,如VirtualBox,然后将该图像恢复为VM,这样您就可以调试而不会干扰您的实际用户。这听起来像是很多工作,但是又重新编写了一个已经存在的应用程序,对吧? :)

失败...... /**/是你的朋友! (好吧,我们正在处理VB,所以'将是你最好的朋友!嘿......但是我开始评论表单上的所有代码,直到那个sucker打开。然后一旦它打开,就开始一次放回一行,并重新运行它...这叫做“VooDoo调试”,但有时,你必须做你必须做的事情......

感谢很多彼得! :)现在你有 ME 这么参与其中,我觉得我是调试这个傻逼的人!就像是我的代码,我试图解决! :)

如果有任何帮助,请告诉我......我实际上对您发现的内容非常感兴趣。