3

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

我的意思是,不要在整个代码中添加跟踪语句,如here或添加错误处理程序以记录到每个过程,如here

这似乎是一个简单的问题。 对不起。 我只是不太了解VB6。 考虑到它使用的广泛程度(或曾经使用过的程度),出乎意料地很难将任何信息谷歌出来。

+0

我问过同样的问题http://stackoverflow.com/questions/127645/is-it-possible-to-retrieve-the-call-stack-programmatically-in-vb6我相信它可以不行。 – raven 2009-07-08 18:35:34

+0

也许我不清楚。我有一个在远程位置生产的应用程序。我没有访问这个系统,我不能在那里运行调试器。他们的环境中有些东西会触发运行时错误。我不能指望他们的IT人员(更不用说常规用户)真正地帮助,除了向我发送任何显示或转储的日志文件之外。我需要一些工具,仪器或任何东西,这将帮助我从他们那里获得有意义的输入。是 - 如乌鸦写道 - 在每个例程中写一个“On Error GoTo/Reraise/LogError”是唯一的方法? – 2009-07-09 15:28:33

+0

那么,你可以用我提到的调试符号进行编译,然后让它们在发生错误时执行内存转储。然后您将能够加载内存转储,并希望使用Visual Studio获取堆栈跟踪。 – Ant 2009-07-10 08:57:21

回答

3

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

如果尽管你仍然得到错误,那么我真的建议你从你的程序堆栈的顶部和使用的

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

Maero的建议这是一个痛苦的工作,你一路下滑,但有没有真正的方法周围。

1

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

就像在旁边一样,我在VB6应用程序中遇到的一个更隐秘的运行时错误是当我使用客户端PC上不存在的控件属性中的字体时。这产生了一个不能被代码困住的运行时错误,所以我添加的错误处理量都没有发现错误。我偶然碰到了它。希望这可以帮助。

2

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

3

VB6调试器有时是片状的。有替代品。

  • 您可以尝试Windbg,这是一款来自Microsoft的免费独立调试器。编译你的VB6时不需要优化和“创建符号化调试信息”(即创建PDB文件),你就可以进行调试。这是微软一位关于在VB6中使用Windbg的2006 blog post,以及另一位微软家伙对012b的简短介绍。
  • 您也可以使用带有VB6和PDB文件的Visual Studio 2008调试程序,例如与Visual C++ Express Edition(这是免费的)。有关更多详细信息,请参阅this
  • Windbg和Visual Studio expect源代码在调试机器上与VB6构建时的构建机器上的路径完全相同。最简单的方法是在同一台机器上构建和调试。否则,您可能需要fiddleSUBST来创建虚拟驱动器 - 或者我被告知认真的方法是使用Symbol Server