【问题标题】:Runtime error stacktrace or location in VB6VB6 中的运行时错误堆栈跟踪或位置
【发布时间】:2010-11-09 02:10:09
【问题描述】:

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

我的意思是,不要像 here 这样在整个代码中放置跟踪语句,或者像 here 这样的每个过程都添加错误处理程序来记录日志。

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

【问题讨论】:

  • 我问了同样的问题stackoverflow.com/questions/127645/…我确信它做不到。
  • 也许我不清楚。我在远程位置有一个生产应用程序。我无法访问该系统,也无法在那里运行调试器。他们的环境中有一些东西会触发运行时错误。除了将显示或转储到日志文件的任何应用程序发送给我之外,我不能指望他们的 IT 人员(更不用说普通用户)真正提供帮助。我需要一些工具、仪器或任何东西,这将帮助我从他们那里获得有意义的输入。是否——正如 raven 所写——在每个例程中编写“On Error GoTo/Reraise/LogError”是唯一的方法?
  • 好吧,您可以使用我提到的调试符号进行编译,然后在发生错误时让它们进行内存转储。然后,您将能够加载内存转储并希望使用 Visual Studio 获取堆栈跟踪。
  • “让他们去做”几乎任何事情都是最难的部分。
  • @Ant - 仅当这些是未处理的异常错误而不是内在的 Visual Basic 运行时错误时才有效。从这个问题上看不清楚。

标签: debugging vb6 error-handling stack-trace production-environment


【解决方案1】:

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

如果您仍然遇到错误,那么我真的建议您从程序堆栈的顶部开始,并使用 Maero 的建议逐步向下进行

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

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

【讨论】:

  • 应用程序被编译为 P 代码。问题不在于调试本机代码。问题是,运行时错误只发生在环境中,我无权访问。我只是希望解释的(P 代码)代码能够比 C/C++ 为我提供更多关于生产系统中运行时错误的信息,而无需我在代码中放置跟踪语句/错误处理程序。
  • 我在这里看到了一个很大的缺点。现在,如果我这样做,所有运行时错误都会得到处理。调试器不会在错误位置停止应用程序。相反,它将在堆栈的其他一些过程中停止在错误处理程序中。因此,此方法有助于生产环境中没有调试器的情况,但会破坏 VB6 IDE 的正常工作。
  • @tomekszpakowicz:正确!经典解决方案的经典问题。试试这个“If Not IsInIDE() Then On Error Goto Handler”,使用这里的 IsInIDE 函数vbnet.mvps.org/index.html?code/helpers/isinide.htm
  • 我对这里的任何答案都不满意。我选择这个答案只是因为 a)我实际上使用这种技术来查明失败的原因,尽管我不愿意在所有代码中乱扔这些东西,并且 b)当我们将代码库迁移到 .NET 时,我只是停下来关心寻找更好的解决方案。
【解决方案2】:

VB6 调试器有时会不稳定。还有其他选择。

  • 您可以尝试Windbg,这是 Microsoft 提供的免费独立调试器。编译没有优化的 VB6 并“创建符号调试信息”(即创建 PDB 文件),您将能够进行调试。这是一位微软人员的2006 blog post,关于在 VB6 中使用 Windbg,另一位微软人员的 2004 blog post 是对 Windbg 的简要介绍。
  • 您还可以将 Visual Studio 2008 调试器与 VB6 和 PDB 文件一起使用,例如Visual C++ Express Edition(免费)。有关详细信息,请参阅this
  • Windbg 和 Visual Studio expect 源代码在调试机器上的路径与构建 VB6 时在构建机器上的路径完全相同。最简单的方法是在同一台机器上构建和调试。否则,您可能需要 fiddleSUBST 来创建虚拟驱动器 - 或者有人告诉我严肃的方法是使用 Symbol Server

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • +1。您还可以使用 Windbg 或 Visual Studio 2008 等免费调试器,请参阅我的回答。
    • 我的意思是 Visual Studio 2008(或 2003 或 2005 或其他),但是是的 - 关于 Windbg 的好点!
    【解决方案4】:

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

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

    【讨论】:

    • 如果您通过已弃用的 Form1.Show 方法调用表单,您将无法捕捉到错误,但如果您使用 Dim form1Instance 作为 Form1: Set form1Instance = new Form1(): form1Instance .显示语法,Set...行会抛出错误
    猜你喜欢
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多