我有一个.net应用程序,它执行COM互操作并调用一些本机库API。其中一个API返回了一些出乎意料的数据,给我带来了麻烦。我正在寻找某种方法来强制托管API的返回值。这并不能解决我的问题,但可以帮我缩小一些范围。我正在简化下面的事情。
记住所有这些,假设我的托管类名为MyClass,它有两个方法ParentMethod()和ChildMethod()。ParentMethod调用ChildMethod,后者在内部调用这些本地API。ChildMethod本身返回一个bool。
在通过Windbg进入我的应用程序之后,我首先运行了!dump堆-type MyClass命令,该命令提供了以下输出
0:027>!垃圾堆-type MyClass 地址MT大小 0ac7e7e4 04ac5030 100 共计0对象 统计数字: MT计数TotalSize类名 04ac50301100 MyNamespace.MyClass 共计1件物品
然后,我运行以下命令,试图获取该类中方法的地址。
0:027> !dumpmt -md 04ac5030 EEClass: 04ac1b20 模块: 04ac49c8 名称: MyNamespace.MyClass mdToken: 02000002 档案: MyAssemblyName,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null BaseSize: 0x64 ComponentSize: 0x0 VTable的插槽: 61 IFaces在IFaceMap中的数量:4 MethodDesc表 条目MethodDesc JIT名称 04b20270 04ac4fd0 JIT MyNamespace.MyClass..ctor() 04b20230 04ac4ffc JIT MyNamespace.MyClass..cctor() 04acc081 04ac4fd8无MyNamespace.MyClass.ParentMethod() 04acc085 04ac4fe4无MyNamespace.MyClass.ChildMethod() 04b202c0.004ac4ff0jit MyNamespace.MyClass.InitializeComponent()
我找到了纳文的博客条目,他描述了沿着同一条线做某事的一些技巧,但我不知道从这里应该采取什么具体步骤。任何帮助都将不胜感激。
发布于 2011-04-17 22:41:36
以下是简单的步骤
bp 04acc085 -这是ChildMethodbp poi(@esp),该命令在返回寄存器上设置断点。r eax=00000001将该值更改为true。eax寄存器将返回值存储在x86中。或者另一种方法是bp 04acc085 "gu;r eax=00000001;gc",它将在一行中执行相同的操作
https://stackoverflow.com/questions/5696877
复制相似问题