Debugging VB6中的运行时错误堆栈跟踪或位置

Debugging VB6中的运行时错误堆栈跟踪或位置,debugging,vb6,error-handling,stack-trace,production-environment,Debugging,Vb6,Error Handling,Stack Trace,Production Environment,我维护一个用VB6编写的旧应用程序。在客户端环境中,它会引发运行时错误,我无法在调试器下重现这些错误。有没有办法获取stacktrace或错误位置 我的意思是,不需要在代码中添加跟踪语句,也不需要在每个过程中添加错误处理程序 这似乎是一个简单的问题。 很抱歉 我只是不太了解VB6。 而且,考虑到信息的使用(或过去)有多广泛,用谷歌搜索出任何信息都是非常困难的。已经有一段时间了,但我认为没有一种方法可以在VB6应用程序中获得堆栈跟踪,而不必添加错误处理程序并输出相应的消息。有一些第三方工具可以将错

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

我的意思是,不需要在代码中添加跟踪语句,也不需要在每个过程中添加错误处理程序

这似乎是一个简单的问题。 很抱歉 我只是不太了解VB6。
而且,考虑到信息的使用(或过去)有多广泛,用谷歌搜索出任何信息都是非常困难的。

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


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

尝试编译到pcode,看看是否仍然会出现错误。这是VB6的调试模式和运行时之间的一个常见区别。我过去常常编译为本机,但遇到的错误只有在运行时才会发生。当我切换到pcode时,我发现要么错误消失了,要么更可能是出现了反映实际问题的新错误,并且更容易在调试模式下重现

如果尽管如此,您仍然会遇到错误,那么我真的建议您从过程堆栈的顶部开始,使用Maero的

On Error Goto Handler
<code>
Exit <routine>
Handler:
Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description
转到处理程序时出错


出口
处理程序:
Err.Raise Err.Number“”(函数名称)->“&Err.source,Err.Description

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

< P>如果在ProjtProjt/Stand选项卡上检查“创建符号调试信息”复选框,那么您可以像Visual Studio一样调试本地的C++应用程序。

< P>有时VB6调试器是片状的。还有其他选择

  • 你可以试试,一个免费的微软独立调试器。在不进行优化的情况下编译VB6并“创建符号调试信息”(即创建PDB文件),您将能够进行调试。下面是一位微软人关于在VB6中使用Windbg的介绍,另一位微软人简要介绍了Windbg
  • 您还可以将Visual Studio 2008调试器与VB6和PDB文件一起使用,例如与(免费)。有关更多详细信息,请参阅
  • Windbg和Visual Studio都要求源代码在调试计算机上的路径与生成VB6时在生成计算机上的路径完全相同。最简单的方法是在同一台机器上构建和调试。否则,您可能需要创建虚拟驱动器,或者我被告知最重要的方法是使用虚拟驱动器

我问了同样的问题,我确信这是不可能的。也许我不清楚。我有一个远程位置的生产应用程序。我没有访问此系统的权限,无法在那里运行调试器。他们的环境中存在触发运行时错误的东西。我不能指望他们的IT员工(更不用说普通用户)真的能帮我,除了把显示或转储到日志文件的任何应用程序发送给我。我需要一些工具、仪器或任何东西,帮助我从他们那里获得有意义的输入。正如raven所写的那样,在每个例程中编写“On Error GoTo/Reraise/LogError”是唯一的方法吗?好的,您可以使用我提到的调试符号进行编译,然后在错误发生时让它们进行内存转储。然后,您将能够加载内存转储,并有望使用Visual Studio获得堆栈跟踪。“让他们去做”几乎是最难的部分。@Ant-仅当这些是未处理的异常错误而不是内在的Visual Basic运行时错误时才起作用。从问题中不清楚它是什么。该应用程序被编译为P代码。问题不是调试本机代码。问题是,运行时错误只发生在环境中,我无权访问。我只是希望解释(P-code)代码能够比C/C++提供更多关于生产系统中运行时错误的信息,而不需要我在代码中添加跟踪语句/错误处理程序。现在,如果我这样做,所有运行时错误都会得到处理。调试器不会在错误位置停止应用程序。相反,它将在堆栈中的其他过程的错误处理程序中停止。因此,此方法有助于I-have-no-debugger-in-production-environment场景,但会破坏VB6 IDE的正常工作。@tomekszpakowicz:正确!经典问题和经典解决方案。尝试使用IsInIDE函数“If Not IsInIDE()Then On Error Goto Handler”,我对这里的任何答案都不满意。我选择这个答案只是因为a)我实际上使用了这种技术来找出失败的原因,尽管我不愿意把所有的代码都用这种东西乱扔,b)当我们将代码库迁移到.NET时,我只是停下来考虑寻找更好的解决方案。如果您通过不推荐的Form1.Show方法调用表单,您将无法捕获错误,但如果将Dim form1Instance用作Form1:Set form1Instance=new Form1():form1Instance.Show语法,则会在集合中引发错误。。。第+1行。你也可以使用免费的调试器,如Windbg或Visual Studio 2008,请看我的答案。我指的是Visual Studio 2008(或2003或2005或其他),但是的,Windbg的优点很好!