网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 大学论文导航 设计下载 最新论文 下载排行 原创论文 论文源代码
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > 其他类别 > 正文

如何使用WinDbg获得托管方法?

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 14/07/21

网学网其他类别编辑为广大网友搜集整理了:如何使用WinDbg获得托管方法?绩等信息,祝愿广大网友取得需要的信息,参考学习。

有时候,我们需要查看一个托管方法的汇编指令是怎么样的。记得在大学的时 候,我们使用gcc -s和objdump来获得一个c程序代码的汇编指令。但是对于.NET 程序来说,我们肯定无法轻松地获得这些内容。因为所有的.NET程序都是编译成 IL代码的,而只有在运行时才会被JIT编译成本机代码。因此,我们必须要在程序 运行之后,再使用某种方式去“探得”汇编指令为何——除非我们可以让JIT在不 运行程序的时候编译IL代码,老赵不知道该怎么做,可能需要朋友的提点。

为了进行这个实验,我们先来写一些简单的示例代码:

namespace TestAsm
{
  public static class  TestClass
  {
    public static int TestMethod(int i) 
    {
      return i;
    }
  }

   class Program
  {
    static void Main(string[]  args)
    {
      Console.WriteLine("Before  JIT.");
      Console.ReadLine();

       TestClass.TestMethod(1);

      Console.WriteLine("After  JIT");
      Console.ReadLine();

       TestClass.TestMethod(1);
    }
  }
}

大家可以新建一个TestAsm项目,将以上代码复制粘贴,并使用Debug模式编译 (避免TestMethod方法被内联,这会导致TestMethod永远不会被JIT) 2,便可以得到一个TestAsm.exe,这就是我们的试验目标。可以看到 代码中调用了两遍TestClass.TestMethod方法,并且分别在调用前使用 Console.ReadLine中断,这使我们有了有机会使用WinDbg来进行一番探索。我们 先进行一番准备工作:

运行TestAsm.exe,看到Before JIT字样(最好不要在VS里调试运行,因为这 会加入VS的的调试模块——虽然这并不影响试验)。

打开WinDbg(假设您已经设好了Symbol Path),按F6(或File - Attach to a Process),选择TestAsm.exe并确定。

加载SOS(例如.load C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 \sos.dll)。

现在我们就已经做好了准备。那么我们第一步是什么呢?自然是要找出 TestClass.TestMethod方法的“位置”,于是先使用!name2ee命令获得TestClass 类的信息:

0:003> !name2ee *!TestAsm.TestClass
Module: 70ca1000  (mscorlib.dll)
--------------------------------------
Module:  00942c5c (TestAsm.exe)
Token: 0x02000002
MethodTable:  0094306c
EEClass: 0094133c
Name: TestAsm.TestClass

“!name2ee *!TestAsm.TestClass”命令的含义是“遍历所有已加载模块,查 找TestAsm.TestClass类型”。如果需要的话,您也可以使用“!name2ee modulename typename”的方式来查找指定模块中的指定类型。从输出中我们可以 看到MethodTable的地址是0028306c。于是我们使用!dumpmt -md <address>命令来查看TestClass类型的方法描述符(Method Descriptor) :

0:003> !dumpmt -md 0094306c
EEClass:  0094133c
Module: 00942c5c
Name: TestAsm.TestClass
mdToken: 02000002 (C:\...\TestAsm\bin\Debug\TestAsm.exe)
BaseSize:  0xc
ComponentSize: 0x0
Number of IFaces in IFaceMap:  0
Slots in VTable: 5
-------------------------------------- 
MethodDesc Table
  Entry MethodDesc   JIT  Name
70e66a70  70ce4934  PreJIT System.Object.ToString() 
70e66a90  70ce493c  PreJIT System.Object.Equals (System.Object)
70e66b00  70ce496c  PreJIT  System.Object.GetHashCode()
70ed72f0  70ce4990  PreJIT  System.Object.Finalize()
0094c040  00943060   NONE  TestAsm.TestClass.TestMethod(Int32)

且看TestMethod的JIT栏的状态:“NONE”,这意味着这个方法还没有经过JIT 的编译,如果我们此时通过!u <address>命令来查看方法的汇编指令就会 看到:

0:003> !u 0094c040
Unmanaged code
0094c040  e8755d9571   call  mscorwks!PrecodeFixupThunk (722a1dba) 
0094c045 5e       pop   esi
0094c046 0000       add   byte ptr [eax],al
0094c048 60        pushad
0094c049 30940000000000 xor   byte ptr  [eax+eax],dl
0094c050 0000      add   byte ptr  [eax],al
0094c052 0000      add   byte ptr  [eax],al
0094c054 0000      add   byte ptr  [eax],al
0094c056 0000      add   byte ptr  [eax],al
0094c058 0000      add   byte ptr  [eax],al

网学推荐

免费论文

原创论文

设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号