在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类方法上设置断点的主要内容,如果未能解决你的问题,请参考以下文章