ddc
联网
平面设计 画册 VI欣赏 包装 CG-插画 搜索 个人网页 Alexa排名 CSS 建站资源 下载专区 JS特效 品牌服装 服装院校 专题欣赏 SEO 图标欣赏 专题
网站建设 域名注册 网站建设 虚拟主机 广州网站设计 域名注册 广州网站建设 上海网站建设 虚拟主机 广州网页设计 虚拟主机 域名注册 acg王国 ACG玩家 品牌设计 上海网站建设
求创科技
网站建设
中国互联
素材出售
中国设计秀
中资源
当前位置:网络学院首页 >> 编程开发 >> .net >> 让JIT运行代码的方法

让JIT运行代码的方法 (4)

来源:中国设计秀    作者:    点击:46     加入收藏    发表评论
0
顶一下
这段代码可能看起来有些令人迷惑,因为这里实际上有两段连接在一起的thunk,接着什么都不做,913070是否也有些面熟呢?他是我们的 Method desc(代码描述)的地址,它被放入EAX,作为JIT编译器的变量传送给JIT(这样JIT才知道需要编译什么代码).我们在方法内上断点,并在断点 停下,看看什么发生了变化

!DumpMT -md 00913080

EEClass: 009113b8

Module: 00912c14

Name: ConsoleApplication29.Foo

mdToken: 02000002 (C:\Documents and Settings\Greg\My Documents\Visual Studio 2005\Projects\ConsoleApplication29\ConsoleApplication29\bin\Release\ConsoleApplication29.exe)

BaseSize: 0xc

ComponentSize: 0x0

Number of IFaces in IFaceMap: 0

Slots in VTable: 6

--------------------------------------

MethodDesc Table

Entry MethodDesc JIT Name

79354bec 7913bd48 PreJIT System.Object.ToString()

793539c0 7913bd50 PreJIT System.Object.Equals(System.Object)

793539b0 7913bd68 PreJIT System.Object.GetHashCode()

7934a4c0 7913bd70 PreJIT System.Object.Finalize()

00de00b0 00913070 JIT ConsoleApplication29.Foo.Test()

009130d4 00913078 NONE ConsoleApplication29.Foo..ctor()

可以看到方法现在已经被JIT编译了,并且Method table也被更新,以反映这个变化(00de00b0).这就是JIT编译后的非托管代码入口,通过查看当前执行堆栈能够证实我们的想法   

!CLRStack

OS Thread Id: 0x8e8 (2280)

ESP EIP

0012f47c 00de00b0 ConsoleApplication29.Foo.Test()

0012f480 00de0087 ConsoleApplication29.Program.Main(System.String[])

0012f69c 79e88f63 [GCFrame: 0012f69c]

从函数里跳出后,测试代码会又一次执行同样的调用,不过这次,他不会在经过thunk,而是直接进入已经产生好的非托管代码

以上就是代码调用的一般机制,除非代码发生"颠簸"(pitched),被反复调入调出,欲知详情,请听下回分解

源文地址:
http://codebetter.com/blogs/gregyoung/archive/2006/07/20/147512.aspx

[1] [2] [3] [4]
2007-08-27 16:00:00    出处:
Google
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明 | 网站公告 | 友情链接 | 留言 | 旧版入口