改变函数返回值

时间:2011-04-17 22:26:51

标签: windbg sos

我有一个.net应用程序正在进行COM互操作并调用一些本机库API。其中一个API正在返回一些意外的数据并导致我头痛。我正在寻找一些强制托管API的返回值的方法。这不会解决我的问题,但帮助我缩小一些事情。我正在简化下面的事情。

记住所有这些,让我们说我的托管类名MyClass,它有两个方法ParentMethod()和ChildMethod()。 ParentMethod调用ChildMethod,它在内部调用那些本机API。 ChildMethod本身返回一个bool。

通过Windbg进入我的应用程序后,我首先运行了!dumpheap -type MyClass命令,它给了我以下输出

  

0:027> !dumpheap -type MyClass
   地址MT尺寸
  0ac7e7e4 04ac5030 100
  总共0个对象
  统计:
        MT Count TotalSize类名   04ac5030 1 100 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
  IFaceMap中的IFaces数量:4
  MethodDesc表
     Entry MethodDesc JIT名称
  04b20270 04ac4f​​d0 JIT MyNamespace.MyClass..ctor()
  04b20230 04ac4f​​fc JIT MyNamespace.MyClass..cctor()
  04acc081 04ac4f​​d8无MyNamespace.MyClass.ParentMethod()
  04acc085 04ac4f​​e4无MyNamespace.MyClass.ChildMethod()
  04b202c0 04ac4f​​f0 JIT MyNamespace.MyClass.InitializeComponent()

我找到了Naveen's blog entry,他描述了一些沿着同一条线做某事的技巧,但我无法弄清楚我应该从这里采取什么样的步骤。任何帮助将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

以下是简单的步骤

  1. bp 04acc085 - 哪个是ChildMethod
  2. 当断点点击时,发出命令bp poi(@esp),设置返回寄存器的断点
  3. 当第二个断点点击时,您可以使用r eax=00000001将值更改为true。 eax寄存器将返回值存储在x86
  4. 或另一种方式是bp 04acc085 "gu;r eax=00000001;gc",它将在一行中执行相同的操作