代码之家  ›  专栏  ›  技术社区  ›  benPearce

VB6中的远程调试

  •  8
  • benPearce  · 技术社区  · 16 年前

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

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

    3 回复  |  直到 16 年前
        1
  •  9
  •   StayOnTarget Charlie Flowers    5 年前

    支持Darryl的回答 Windbg -这里有一个 2006 blog post 2004 blog post

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

    WinDbg的远程调试设施。将WinDbg的副本附加到 (请在WinDbg帮助中签出.server)。然后您可以连接到它 远程从WinDbg的文件菜单。这就像是 调试远程设备时,WinDbg的副本只是一个非常智能的终端 因此,所有扩展名、符号等都必须位于远程服务器上。

    在组件加载之前,不会加载组件的符号 因此,您必须让服务器至少运行那么长的时间。你可以把 这一点,但如果你这样做了,请记住,它将停止在那里每一次 通过代码。让我们假设你让它运行,然后闯入。 然后,您将看到所有函数以及许多符号 给你打包好了。VB添加了很多界面和符号 用C++双冒结惯例代替友好小号 点WinDbg不明白VB是不同的,它是被处理的

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

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

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

    如果需要,您可以进入VB运行时,但可能不会 您会注意到VBs内部受COM的影响很大。这个 由于一些COM思想来自VB,所以影响实际上是双向的 原来

    运行代码时可能会看到异常。空引用 异常(即取消对空指针的引用)并不少见或常见 有什么好担心的吗。他们将作为第一次机会C000005出现 如果有对象设置为nothing,但这是安全的,因为 只有可能的值为null或有效值。你也会看到 如果代码在集合中查找并且值为 不在那里。因为异常现在非常昂贵,所以您可能需要 常见的是c000008f。如果你查一下这个数字,你就会发现 这是一个浮点不精确结果异常。它是用在一个 这里的含义不同,因为我们不生成真正的浮点 不精确的结果异常,可以安全地抛出它们以指示VB 正常可捕获类型的错误。

    VB组件中的挂起和崩溃调试在 与任何其他非托管组件的方式相同,但它只是有一点 因为上面描述的编译,所以更难。如果你必须尝试 用这种方式调试VB代码,我强烈建议你开始 在一个“Hello world”应用程序上,一路向上。一切 这可能会使VB成为一种容易编写代码的语言,使其成为一种糟糕的语言 调试。

        2
  •  3
  •   Kribensa    16 年前

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

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

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

    祝你好运

        3
  •  3
  •   Darryl Braaten    16 年前

    你试过了吗 windbg ? 只要确保你有项目的pdb文件。