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

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

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

有帮助吗?

解决方案

我相信,在VB6调试时,它不连接到正在运行的二进制,而是把它解释自己的过程中的代码。这就是为什么任务管理器和Win32 API的显示VB6.EXE作为正在运行的应用调试时。

也正如你所说,VB6有时短路调用所以拦截这些调用COM库是不可能的。

您很可能将不得不诉诸智能日志记录(即你在哪里得到的错误发生在定位的代码它发生上线的希望记录的点周围变量的值,和/或状态的相关变量。)

好运

其他提示

支持达里尔的回答建议 风数据库 - 这是一个 2006 年博客文章 由一位 Microsoft 人员介绍如何将 Windbg 与 VB6 一起使用,以及 2004 年博客文章 另一位 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源码模块,将 其中的断点与 F9 虽然 VB 文件扩展名不在 “源文件类型”下拉列表。单步执行代码很有启发性 但如果您没有看到 VB 的代码,可能会有点令人担忧 之前为您生成。您将逐步完成汇编程序 里面有很多 COM 粘液。H结果被检查了很多。您可能需要经常参考来源以找出位置 你是,因为需要一些练习才能知道什么 源代码看起来像。变体尤其具有挑战性,因为 VB 在那里为您做了很多工作,看起来很简单 方程式可以产生大量的代码。优化的代码是均匀的 更难,因为执行顺序通常与 您可能期望什么,并且比平时更难查看数据。

通过这种方式获取数据并不容易。查看局部变量时 (dv 是命令),那么您可能会看到变量被简单地列出 黯然失色,这意味着内存被用于某事 否则,在函数生存期内,或者名称不是 在这种背景下独一无二。枚举仅显示为整数或多头,并且 对象显示为指针。事实上,他们一直都是这样,但是 VB IDE 会向您隐藏这一点。VB 字符串是 COM BSTR(和 因此,Unicode)在封面和字节数组下确实是字符 阵 列。您可能会惊讶地发现 VB 字符串是 Unicode 因为 VB 似乎不支持 ANSI 以外的任何东西。那是 因为 Ruby 表单引擎只是 ANSI。运行时将 将 Unicode 字符串转换为 ANSI 用于 Ruby 和 API 调用,尽管有一些方法 如果需要,可以传递 Unicode。

您将无法获取 Err、App 或 Printer 对象 因为您需要经过很多内部和完整的 无证结构来对付他们。即使你能到达那里, 它们只是原始数据,没有 在 VB 中使用。如果您需要查看这些字段中的任何一个,最好的选择 是在源代码中嵌入调试代码以将其值复制到 你可以到达的地方。

如果您愿意,您可以介入VB运行时,但是如果您要调试应用程序,可能不会透露它。如果这样做,您会注意到VB的内部元件受到非常影响的影响。实际上,影响实际上是两种方式,因为一些COM想法最初来自VB。

运行代码时您可能会看到异常。空引用 异常(即取消引用空指针)并不少见,或者 有什么好担心的。他们将作为第一次机会出现C000005 地址为 0 或几乎为 0 的异常。运行时有时会这样做 如果有对象设置为什么都没有,但这是安全的,因为 只有可能的值为 null 或有效值。您还将看到 如果您的代码在集合中执行查找,并且值为 不在那里。由于异常现在非常昂贵,您可能需要 如果可以的话,避免这样做。另一个例外,你会 通常看到的是 C000008F。如果你查一下这个数字,那么你会发现 这是一个浮点不精确的结果异常。它用于 这里的含义不同——因为我们不生成真正的浮点 不精确的结果异常,可以安全地抛出它们以指示 VB 正常可捕获类型的错误。

VB组件中的调试悬挂和崩溃的方式与与其他任何不受管理的组件相同,但是由于上述汇编,这要困难得多。如果您必须尝试以这种方式调试VB代码,我强烈建议您从“ Hello World”应用程序开始并进行工作。所有的事情 这可能使 VB 成为一种易于编码的语言,使其成为一种糟糕的语言 调试。

您是否尝试过的WinDbg ?只要确保你有PDB文件的项目。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top