楔子有小伙伴被面试官问到这个问题 , 本篇彻底解析下这个问题 。
为了彻底点 , 注意本篇是最底层的.Net 7 RC CLR
运行模型(汇编)为基础进行全局剖析 , 局部业务分析 。
如有疏漏 , 请斧正 。
目的非手段这两个函数比较特殊的存在 , .Ctor
是非静态默认实例化 。.CCtor
是静态默认实例化 。这两个函数伴随着.Net
任何对象的实例化都自动存在于这个对象当中 。
跟踪.CCtor
可以在全局静态对象下断点 , 观察它的里面运行 。跟踪.Ctor
可以通过!name2ee
模块 模块.类名..Ctor
找到JITTED Code Address
, 观察它的运行 。正如本段题所说 , 这只是手段 , 不是目的 。所以下面看目的 。
.Ctor目的先来看下非静态默认构造函数.Ctor
。上一段代码:
internal class Program{public class ABC{}static void Main(string[] args){ABC abc = new ABC();Console.ReadLine();}}
直接给它反编译:
00007FFDF2FA03B0 55pushrbp00007FFDF2FA03B1 48 83 EC 40subrsp,40h00007FFDF2FA03B5 48 8D 6C 24 40learbp,[rsp+40h]00007FFDF2FA03BA C5 D8 57 E4vxorpsxmm4,xmm4,xmm400007FFDF2FA03BE C5 FA 7F 65 E8vmovdquxmmword ptr [rbp-18h],xmm400007FFDF2FA03C3 33 C0xoreax,eax00007FFDF2FA03C5 48 89 45 F8movqword ptr [rbp-8],rax00007FFDF2FA03C9 48 89 4D 10movqword ptr [rbp+10h],rcx00007FFDF2FA03CD 83 3D BC E9 19 00 00 cmpdword ptr [7FFDF313ED90h],000007FFDF2FA03D4 74 05je00007FFDF2FA03DB00007FFDF2FA03D6 E8 B5 BF 79 5EcallJIT_DbgIsJustMyCode (07FFE5173C390h)00007FFDF2FA03DB 90nop00007FFDF2FA03DC 48 B9 30 F6 5B F3 FD 7F 00 00 movrcx,7FFDF35BF630h00007FFDF2FA03E6 E8 75 7C C1 5EcallJIT_TrialAllocSFastMP_InlineGetThread (07FFE51BB8060h)00007FFDF2FA03EB 48 89 45 F0movqword ptr [rbp-10h],rax00007FFDF2FA03EF 48 8B 4D F0movrcx,qword ptr [rbp-10h]// 这个地方是调用了.Ctor00007FFDF2FA03F3 FF 15 0F 8D 60 00callqword ptr [7FFDF35A9108h]00007FFDF2FA03F9 48 8B 45 F0movrax,qword ptr [rbp-10h]00007FFDF2FA03FD 48 89 45 F8movqword ptr [rbp-8],rax00007FFDF2FA0401 FF 15 A9 93 60 00callqword ptr [7FFDF35A97B0h]00007FFDF2FA0407 48 89 45 E8movqword ptr [rbp-18h],rax00007FFDF2FA040B 90nop00007FFDF2FA040C 90nop00007FFDF2FA040D 48 83 C4 40addrsp,40h00007FFDF2FA0411 5Dpoprbp00007FFDF2FA0412 C3ret
【.Net 7里的函数.Ctor和.CCtor是干啥用的呢?你知道吗】调用.Ctor
的地方注释了下 , 如果直接进入会调用到PrecodeFixupThunk
。所以这里需要在PreStubWorker
下断点 。一路跟踪下去发现这个.Ctor
是利用预备的IL代码 , 让RyuJIt
对它进行一个编译
.Ctor
调用堆栈:
coreclr.dll!MethodDesc::JitCompileCodeLocked 行 952 C++coreclr.dll!MethodDesc::JitCompileCodeLockedEventWrapper 行 823 C++coreclr.dll!MethodDesc::JitCompileCode 行 763 C++coreclr.dll!MethodDesc::PrepareILBasedCode 行 426 C++coreclr.dll!MethodDesc::PrepareCode 行 323 C++coreclr.dll!CodeVersionManager::PublishVersionableCodeIfNecessary 行 1698 C++coreclr.dll!MethodDesc::DoPrestub 行 2109 C++coreclr.dll!PreStubWorker 行 1938coreclr.dll!ThePreStub(
到JitCompileCodeLocked
里面调用了UnsafeJitFunction
为止 , 因为后面都是RyuJit的
复杂编译过程 , 此处不述 。
我们来看下UnsafeJitFunction
返回的pCode
地址处的汇编代码:
00007FFDF2F80430 55pushrbp00007FFDF2F80431 57pushrdi00007FFDF2F80432 48 83 EC 28subrsp,28h00007FFDF2F80436 48 8D 6C 24 30learbp,[rsp+30h]00007FFDF2F8043B 48 89 4D 10movqword ptr [rbp+10h],rcx00007FFDF2F8043F 83 3D 4A E9 19 00 00 cmpdword ptr [7FFDF311ED90h],000007FFDF2F80446 74 05je00007FFDF2F8044D00007FFDF2F80448 E8 43 BF 7B 5EcallJIT_DbgIsJustMyCode (07FFE5173C390h)00007FFDF2F8044D 48 8B 4D 10movrcx,qword ptr [rbp+10h]00007FFDF2F80451 FF 15 D9 0B E5 FFcallqword ptr [7FFDF2DD1030h]00007FFDF2F80457 90nop00007FFDF2F80458 90nop00007FFDF2F80459 48 83 C4 28addrsp,28h00007FFDF2F8045D 5Fpoprdi00007FFDF2F8045E 5Dpoprbp00007FFDF2F8045F C3ret
经验总结扩展阅读
- 甲木的正缘是己土 理念一致夫妻和睦
- 怀念儿时味道的文案 80后农村童年怀旧说说
- 液晶电视什么牌子的质量好 液晶电视排名前十名品牌
- 心遇app女人是免费的吗
- yoyoyoyoyo是什么意思
- 矮的拼音怎么写 矮的解释是什么
- 什么牌子的床性价比高一些 买床哪种材质好又耐用
- 海信稳坐电视销量 其中的秘密有哪些
- 毒五月的九毒日是哪几天
- 杰瑞左右选择是什么梗