【发布时间】: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 代理/存根进行跟踪。