VB6中的远程调试

VB6中的远程调试,vb6,clickonce,regfreecom,Vb6,Clickonce,Regfreecom,是否可以远程调试在VB6之外启动的进程 该应用程序是一个VB6应用程序,具有相当多的dll/ocx资源。我正在尝试使用免注册COM设置VB6应用程序的ClickOnce部署,但在执行时出现错误 我对VB6重定向COM注册方式的理解可能意味着这是不可能的,但我认为有人可能会有更好的想法。我相信在VB6中调试时,它不会附加到正在运行的二进制文件,而是在自己的进程中解释代码。这就是为什么任务管理器和Win32 API在调试时将VB6.exe显示为正在运行的应用程序 正如您所说,VB6有时会短路对COM

是否可以远程调试在VB6之外启动的进程

该应用程序是一个VB6应用程序,具有相当多的dll/ocx资源。我正在尝试使用免注册COM设置VB6应用程序的ClickOnce部署,但在执行时出现错误


我对VB6重定向COM注册方式的理解可能意味着这是不可能的,但我认为有人可能会有更好的想法。

我相信在VB6中调试时,它不会附加到正在运行的二进制文件,而是在自己的进程中解释代码。这就是为什么任务管理器和Win32 API在调试时将VB6.exe显示为正在运行的应用程序

正如您所说,VB6有时会短路对COM库的调用,因此拦截这些调用并不总是可能的

您可能不得不求助于智能日志记录(即,记录错误发生点周围的变量值,以定位发生错误的代码行和/或相关变量的状态)


祝你好运你试过了吗?只需确保您有用于该项目的pdb文件。

为了支持Darryl的建议,这里有一位Microsoft人员关于在VB6中使用Windbg的介绍,以及另一位Microsoft人员对Windbg的简要介绍

编辑:只是为了让它完全清楚。Windbg是Microsoft提供的免费独立调试器。将VB6 EXE、DLL和OCX编译成带有符号的本机代码(创建PDB文件),您将能够调试ClickOnce应用程序

博客的主要摘录:

如果对服务器计算机的访问受限,则可以使用 WinDbg的远程调试设施。将WinDbg的副本附加到 以通常的方式处理,然后将其交给调试服务器 (请在WinDbg帮助中签出.server)。然后您可以连接到它 远程从WinDbg的文件菜单。这就像是 除了服务器机房风扇发出的噪音外,没有其他噪音。什么时候 调试远程设备时,WinDbg的副本只是一个非常智能的终端 因此,所有扩展名、符号等都必须位于远程服务器上。 对于任何DLL、VB6或.NET,您都可以使用完全相同的方式设置它

在组件加载之前,不会加载组件的符号 因此,您必须让服务器至少运行那么长的时间。你可以把 如果您想在运行时停止调试器,请在VB代码的早期中断 这一点,但如果你这样做了,请记住,它将停止在那里每一次 通过代码。让我们假设你让它运行,然后闯入。 如果您用“x MyModule!*”列出模块的加载符号 然后,您将看到所有函数以及许多符号 给你打包好了。VB添加了很多界面和符号 但你通常不需要担心这些。一个 看起来很奇怪的是,所有的类/方法语法 用C++双冒结惯例代替友好小号 圆点。WinDbg不明白VB是不同的,它被处理过 就像任何带有符号的DLL一样

从这里开始,您可以按照通常的方式(bp等)和步骤设置断点 通过代码。您还可以打开VB源代码模块并设置 虽然VB文件扩展名不在其中,但使用F9在其中设置断点 “源文件类型”下拉列表。逐步浏览代码很有启发性 但是如果您没有看到VB提供的代码,可能会有点令人担忧 我以前为你做过。您将逐步完成汇编程序 而且里面有很多粘糊糊的东西。HRESULT经常被检查。 您可能需要经常参考源代码以确定在哪里 你是因为需要一点练习才能知道 源代码看起来像。变种尤其具有挑战性,因为 VB在那里为您做了很多工作,看起来很简单 这个方程会产生大量的代码。优化后的代码是均匀的 更难,因为执行顺序通常与 您可能期望的,并且比平常更难看到数据

以这种方式获取数据并不容易。当你看局部变量时 (dv是命令)然后您可能会看到变量只是列出的 就像日蚀一样,这意味着记忆被用来做某事 否则在函数生命周期内,或者名称不是 在这方面是独一无二的。枚举只显示为整数或long和 对象显示为指针。事实上,他们一直都是这样但是 VB IDE对您隐藏了这一点。VB字符串是COM BSTR(和 因此,封面下的字符(Unicode)和字节数组实际上是字符 数组。您可能会惊讶地发现VB字符串是Unicode 因为VB似乎只支持ANSI。就是 因为Ruby表单引擎只是ANSI。运行库转换 Unicode字符串到ANSI,用于Ruby和API调用 如果需要,可以传递Unicode

您将无法获取错误、应用程序或打印机对象 因为你需要经历很多内部和完全的 未记录的结构来获取它们。即使你能到达那里, 它们只是原始数据,没有您需要的访问器函数 在VB中使用。如果您需要查看这些字段中的任何一个,您的最佳选择是 是在源代码中嵌入调试代码以将其值复制到 你能找到的地方

如果需要,您可以进入VB运行时,但可能不会 如果您正在尝试调试应用程序,那么这将非常有启发性。如果你这样做, 您会注意到VB的内部结构受到COM的影响。这个 由于一些COM思想来自VB,所以影响实际上是双向的 原来是

运行代码时可能会看到异常。空引用 异常(即取消对空指针的引用)并不少见或常见 有什么好担心的吗。他们会表现出来的