在windbg中的COM类方法上设置断点

Posted

技术标签:

【中文标题】在windbg中的COM类方法上设置断点【英文标题】:Set breakpoint on COM class method in windbg 【发布时间】:2011-04-13 19:16:47 【问题描述】:

有没有办法,类似于“bm Module!Symbol”在windbg中COM类的特定方法上设置断点?看起来 COM DLL 只导出四个符号(DllCanUnloadNow、DllGetClassObject、DllRegisterServer 和 DllUnregisterServer),因此通常的“bm”方法不起作用。我假设还有其他方法可以做到这一点,但我在过去一个小时左右找不到它。

【问题讨论】:

你有这个 COM DLL 的符号吗?如果您只看到导出函数,这意味着您没有符号。只要找到符号,你应该能够使用常规的“bp”命令设置断点,假设模块已经加载。如果模块尚未加载,则在模块加载时设置断点:“sxe ld:MyModuleName.dll”,然后在加载模块时使用“bp MyModuleName!MyClass:MyMethod”设置断点。 很遗憾,我没有库的任何调试符号。有什么方法可以提取 COM 类上各种方法的地址吗?似乎必须有。 没有符号就没有好的解决方案。如果 COM 对象在同一个 appartment 中实例化,或者 COM 对象配置为支持中性 appartment 模型,您可以从您实例化的 COM 对象的虚拟方法表中获取指向方法的指针。然而它的对象来自不同的公寓(这意味着你的代码获得了一个 RPC 代理,而不是一个真实的对象)然后找到一个实现要困难得多——我将无法通过 RPC 代理/存根进行跟踪。 【参考方案1】:

您应该能够使用 bu(未解决的断点)。我相信语法如下,但我的记忆可能生疏了:

bu MyDll!MyClass::MyMethod

【讨论】:

嗯,可能有点不同。当我尝试然后开始执行时,在所有模块/符号加载完成后,我得到“断点 0 的偏移表达式评估失败。检查无效符号或错误语法。WaitForEvent 失败”。 无赖。哦,好吧,我看看我能不能制定一个 B 计划。【参考方案2】:

COM 方法仍然是常规符号,即使它们没有被导出。假设您有 MyFoo.dll,其中包含 MyBar::Baz() 方法。在 WinDbg 中,如果您加载了符号,您可以使用以下命令对符号进行 X

X MyFoo!*Baz*
00007ffa`204cbb00 MyFoo!MyBar::Baz (void)

你可以在上面设置断点

bp MyFoo!MyBar::Baz

【讨论】:

以上是关于在windbg中的COM类方法上设置断点的主要内容,如果未能解决你的问题,请参考以下文章

在命名函数上放置断点

在 WinDBG 中使用源代码行号设置断点

转: windbg-跳过初始断点(调试技巧)

WinDbg命令系统

在协议方法上设置断点

IntelliJ IDEA调试器可以自行设置断点吗?