3

我维护一个用 VB6 编写的旧应用程序。在客户端的环境中,它会引发我无法在调试器下重现的运行时错误。有什么方法可以获取堆栈跟踪或错误位置吗?

我的意思是,不要像这里那样在整个代码中放置跟踪语句,也不需要像这里那样添加错误处理程序来记录每个过程。

这似乎是一个简单的问题。对不起。我只是不太了解VB6。考虑到它被(或曾经)使用的广泛程度,谷歌搜索出任何信息是非常困难的。

4

4 回答 4

3

尝试编译到 pcode 看看是否仍然出现错误。这是 VB6 的调试模式和运行时之间的一个共同区别。我曾经编译为本机并遇到仅在运行时发生的错误。当我切换到 pcode 时,我发现错误消失了,或者更可能是一个反映实际问题的新错误出现了,并且在调试模式下更容易重现。

如果尽管如此,您仍然遇到错误,那么我真的建议您从程序堆栈的顶部开始,并使用 Maero 的建议向下工作

On Error Goto Handler
<code>
Exit <routine>
Handler:
Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description

这是一种痛苦,但没有真正的解决方法。

于 2009-07-08T18:29:49.687 回答
3

VB6 调试器有时很不稳定。有替代方案。

  • 你可以试试Windbg,一个来自 Microsoft 的免费独立调试器。编译您的 VB6,不进行优化并“创建符号调试信息”(即创建 PDB 文件),您将能够进行调试。这是 Microsoft 人员2006 年关于将 Windbg 与 VB6 结合使用的博客文章,以及另一位 Microsoft 人员 2004 年关于 Windbg的简要介绍的博客文章。
  • 您还可以将 Visual Studio 2008 调试器用于 VB6 和 PDB 文件,例如使用Visual C++ Express Edition(免费)。有关更多详细信息,请参阅内容。
  • Both Windbg and Visual Studio expect the source code to be in exactly the same path on the debug machine as it was on the build machine when the VB6 was built. The easiest way is to build and debug on the same machine. Otherwise you might need to fiddle with SUBST to create virtual drives - or I'm told the serious way is to use a Symbol Server.
于 2009-07-12T17:21:50.360 回答
2

如果选中项目属性/编译选项卡上的“创建符号调试信息”复选框,则可以在 Visual Studio 中进行调试,就像在本机 C++ 应用程序中一样。

于 2009-07-09T08:31:19.687 回答
1

已经有一段时间了,但我认为没有一种方法可以在不添加错误处理程序并输出适当消息的情况下在 VB6 应用程序中获取堆栈跟踪。有一些第三方工具会为整个应用程序添加错误处理,但我相信它只是在整个代码中添加了“On Error Goto”错误处理程序。

顺便说一句,我在 VB6 应用程序中遇到的一个更隐蔽的运行时错误是当我在控件的属性中使用客户端 PC 上不存在的字体时。这会生成一个无法在代码中捕获的运行时错误,因此我添加的任何错误处理都没有发现该错误。我终于偶然遇到了它。希望这可以帮助。

于 2009-07-08T15:46:17.693 回答