成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

.Net 7函數Ctor與CCtor使用及區別詳解

瀏覽:215日期:2022-06-09 10:09:41
目錄
  • 楔子
  • 目的非手段
  • .Ctor目的
  • .CCtor目的

楔子

有小伙伴被面試官問到這個問題,本篇徹底解析下這個問題。

為了徹底點,注意本篇是最底層的.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 55   pushrbp  
00007FFDF2FA03B1 48 83 EC 40  sub rsp,40h  
00007FFDF2FA03B5 48 8D 6C 24 40       lea rbp,[rsp+40h]  
00007FFDF2FA03BA C5 D8 57 E4  vxorps      xmm4,xmm4,xmm4  
00007FFDF2FA03BE C5 FA 7F 65 E8       vmovdqu     xmmword ptr [rbp-18h],xmm4  
00007FFDF2FA03C3 33 C0xor eax,eax  
00007FFDF2FA03C5 48 89 45 F8  mov qword ptr [rbp-8],rax  
00007FFDF2FA03C9 48 89 4D 10  mov qword ptr [rbp+10h],rcx  
00007FFDF2FA03CD 83 3D BC E9 19 00 00 cmp dword ptr [7FFDF313ED90h],0  
00007FFDF2FA03D4 74 05je  00007FFDF2FA03DB  
00007FFDF2FA03D6 E8 B5 BF 79 5E       callJIT_DbgIsJustMyCode (07FFE5173C390h)  
00007FFDF2FA03DB 90   nop  
00007FFDF2FA03DC 48 B9 30 F6 5B F3 FD 7F 00 00 mov rcx,7FFDF35BF630h  
00007FFDF2FA03E6 E8 75 7C C1 5E       callJIT_TrialAllocSFastMP_InlineGetThread (07FFE51BB8060h)  
00007FFDF2FA03EB 48 89 45 F0  mov qword ptr [rbp-10h],rax  
00007FFDF2FA03EF 48 8B 4D F0  mov rcx,qword ptr [rbp-10h]  
// 這個地方是調用了.Ctor
00007FFDF2FA03F3 FF 15 0F 8D 60 00    callqword ptr [7FFDF35A9108h]  
00007FFDF2FA03F9 48 8B 45 F0  mov rax,qword ptr [rbp-10h]  
00007FFDF2FA03FD 48 89 45 F8  mov qword ptr [rbp-8],rax  
00007FFDF2FA0401 FF 15 A9 93 60 00    callqword ptr [7FFDF35A97B0h]  
00007FFDF2FA0407 48 89 45 E8  mov qword ptr [rbp-18h],rax  
00007FFDF2FA040B 90   nop  
00007FFDF2FA040C 90   nop  
00007FFDF2FA040D 48 83 C4 40  add rsp,40h  
00007FFDF2FA0411 5D   pop rbp  
00007FFDF2FA0412 C3   ret  

調用.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 行 1938	
 	coreclr.dll!ThePreStub(

JitCompileCodeLocked里面調用了UnsafeJitFunction為止,因為后面都是RyuJit的復雜編譯過程,此處不述。

我們來看下UnsafeJitFunction返回的pCode地址處的匯編代碼:

00007FFDF2F80430 55   pushrbp  
00007FFDF2F80431 57   pushrdi  
00007FFDF2F80432 48 83 EC 28  sub rsp,28h  
00007FFDF2F80436 48 8D 6C 24 30       lea rbp,[rsp+30h]  
00007FFDF2F8043B 48 89 4D 10  mov qword ptr [rbp+10h],rcx  
00007FFDF2F8043F 83 3D 4A E9 19 00 00 cmp dword ptr [7FFDF311ED90h],0  
00007FFDF2F80446 74 05je  00007FFDF2F8044D  
00007FFDF2F80448 E8 43 BF 7B 5E       callJIT_DbgIsJustMyCode (07FFE5173C390h)  
00007FFDF2F8044D 48 8B 4D 10  mov rcx,qword ptr [rbp+10h]  
00007FFDF2F80451 FF 15 D9 0B E5 FF    callqword ptr [7FFDF2DD1030h]  
00007FFDF2F80457 90   nop  
00007FFDF2F80458 90   nop  
00007FFDF2F80459 48 83 C4 28  add rsp,28h  
00007FFDF2F8045D 5F   pop rdi  
00007FFDF2F8045E 5D   pop rbp  
00007FFDF2F8045F C3   ret  

它里面就調用了一個Call,也就是這句話:

call  qword ptr [7FFDF2DD1030h]  

這個十六進制的7FFDF2DD1030h是個啥呢?繼續跟進下:0x00007FFDF2DD1030 00007ffe50357230它里面包含了一個地址00007ffe50357230看下這個地址的匯編代碼:

00007FFE50357230 C3   ret 

它直接返回了。

所以這得出了一個什么結論呢?也就是說在當前這個例子中,.Ctor啥都沒做。

.CCtor目的

來看下靜態的默認構造函數干了些啥。先上代碼:

    internal class Program
    {
static string a ="abcd";
static void Main(string[] args)
{
    string i = a;
    Console.WriteLine(a);
    Console.ReadLine();
}
    }

同樣反編譯下:

00007FFDF01903B0 55   pushrbp  
00007FFDF01903B1 57   pushrdi  
00007FFDF01903B2 48 83 EC 28  sub rsp,28h  
00007FFDF01903B6 48 8D 6C 24 30       lea rbp,[rsp+30h]  
00007FFDF01903BB 33 C0xor eax,eax  
00007FFDF01903BD 48 89 45 F0  mov qword ptr [rbp-10h],rax  
00007FFDF01903C1 48 89 4D 10  mov qword ptr [rbp+10h],rcx  
00007FFDF01903C5 83 3D C4 E9 19 00 00 cmp dword ptr [7FFDF032ED90h],0  
00007FFDF01903CC 74 05je  00007FFDF01903D3  
00007FFDF01903CE E8 BD BF 7D 5E       callJIT_DbgIsJustMyCode (07FFE4E96C390h)  
00007FFDF01903D3 90   nop  
00007FFDF01903D4 48 B9 60 EF 32 F0 FD 7F 00 00 mov rcx,7FFDF032EF60h  
00007FFDF01903DE BA 04 00 00 00       mov edx,4  
// 可以看到這個 string 靜態對象并沒有調用.CCtor。
// 那是否說明上面的說法不對呢?注意看,他實際調用了
// JIT_GetSharedNonGCStaticBase_SingleAppDomain,
// 而這個就是關鍵所在
00007FFDF01903E3 E8 48 7E C5 5E       callJIT_GetSharedNonGCStaticBase_SingleAppDomain (07FFE4EDE8230h)  
00007FFDF01903E8 8B 0D AA EB 19 00    mov ecx,dword ptr [7FFDF032EF98h]  
00007FFDF01903EE FF 15 7C 94 60 00    callqword ptr [7FFDF0799870h]  
00007FFDF01903F4 90   nop  
00007FFDF01903F5 FF 15 9D 93 60 00    callqword ptr [7FFDF0799798h]  
00007FFDF01903FB 48 89 45 F0  mov qword ptr [rbp-10h],rax  
00007FFDF01903FF 90   nop  
00007FFDF0190400 90   nop  
00007FFDF0190401 48 83 C4 28  add rsp,28h  
00007FFDF0190405 5F   pop rdi  
00007FFDF0190406 5D   pop rbp  
00007FFDF0190407 C3   ret  
00007FFDF0190408 19 06sbb dword ptr [rsi],eax  

看這段代碼上面的注釋,這段代碼里面并沒有.CCtor被調用的痕跡。而它的奧秘在JIT_GetSharedNonGCStaticBase_SingleAppDomain函數里面。

JIT_GetSharedNonGCStaticBase_SingleAppDomain又調用了JIT_GetSharedNonGCStaticBase_Helper

看下堆棧

>	coreclr.dll!MethodTable::RunClassInitEx 行 3591	C++
 	coreclr.dll!MethodTable::DoRunClassInitThrowing 行 3792	C++
 	coreclr.dll!MethodTable::CheckRunClassInitThrowing 行 3929	C++
 	coreclr.dll!JIT_GetSharedNonGCStaticBase_Helper 行 1401	C++

函數RunClassInitEx代碼如下:

BOOL MethodTable::RunClassInitEx(OBJECTREF *pThrowable)
{
    //為了方便觀看 此處省略部分代碼
    PCODE pCctorCode = pCanonMT->GetSlot(pCanonMT->GetClassConstructorSlot());
    //為了方便觀看 此處省略部分代碼
    PREPARE_NONVIRTUAL_CALLSITE_USING_CODE(pCctorCode);
    DECLARE_ARGHOLDER_ARRAY(args, 0);
    CATCH_HANDLER_FOUND_NOTIFICATION_CALLSITE;
    CALL_MANAGED_METHOD_NORET(args);
	    //為了方便觀看 此處省略部分代碼

變量pCctorCode就是.CCtor的函數頭地址。而后面的一堆的宏定義實際上是調用了函數DispatchCallSimple,而DispatchCallSimple又調用了CallDescrWorkerWithHandler然后又調用了PrecodeFixupThunk下面調用了PreStubWorker

PreStubWorker通過call rax命令跳轉到調用的函數的函數頭地址,比如本例的.CCtor函數頭的地址。

00007FFE8BB289C0 E8 DB FE 8F FF       callPreStubWorker (07FFE8B4288A0h)  
00007FFE8BB289C5 66 0F 6F 44 24 20    movdqa      xmm0,xmmword ptr [rsp+20h]  
00007FFE8BB289CB 66 0F 6F 4C 24 30    movdqa      xmm1,xmmword ptr [rsp+30h]  
00007FFE8BB289D1 66 0F 6F 54 24 40    movdqa      xmm2,xmmword ptr [rsp+40h]  
00007FFE8BB289D7 66 0F 6F 5C 24 50    movdqa      xmm3,xmmword ptr [rsp+50h]  
00007FFE8BB289DD 48 8B 8C 24 B0 00 00 00 mov rcx,qword ptr [rsp+0B0h]  
00007FFE8BB289E5 48 8B 94 24 B8 00 00 00 mov rdx,qword ptr [rsp+0B8h]  
00007FFE8BB289ED 4C 8B 84 24 C0 00 00 00 mov r8,qword ptr [rsp+0C0h]  
00007FFE8BB289F5 4C 8B 8C 24 C8 00 00 00 mov r9,qword ptr [rsp+0C8h]  
00007FFE8BB289FD 48 83 C4 68  add rsp,68h  
00007FFE8BB28A01 5F   pop rdi  
00007FFE8BB28A02 5E   pop rsi  
00007FFE8BB28A03 5B   pop rbx  
00007FFE8BB28A04 5D   pop rbp  
00007FFE8BB28A05 41 5Cpop r12  
00007FFE8BB28A07 41 5Dpop r13  
00007FFE8BB28A09 41 5Epop r14  
00007FFE8BB28A0B 41 5Fpop r15  
// 這個rax 就是 .CCtor的函數頭的地址
00007FFE8BB28A0D 48 FF E0     jmp  rax  

jmp rax跳轉到了如下:

00007FFE2CFE8888 FF 25 FA 0F 00 00 jmp qword ptr [7FFE2CFE9888h]

7FFE2CFE9888h地址的值是00007FFE8A50C7A0

注意這句代碼

static string a ="abcd";

它實際上被編譯成了一個函數,當運行到.CCtor的時候,會調用它,然后對它進行賦值abcd

>>> 00007ffe`06ac29e0 55      push    rbp
00007ffe`06ac29e1 4883ec20sub     rsp,20h
00007ffe`06ac29e5 488d6c2420      lea     rbp,[rsp+20h]
00007ffe`06ac29ea 833d9f410c0000  cmp     dword ptr [00007ffe`06b86b90],0
00007ffe`06ac29f1 7405    je      ConsoleApp3!ConsoleApp3.Program..cctor+0x18 (00007ffe`06ac29f8)
00007ffe`06ac29f3 e8e8a4cd5f      call    coreclr!JIT_DbgIsJustMyCode (00007ffe`6679cee0)
00007ffe`06ac29f8 48bad83000186c020000 mov rdx,26C180030D8h
00007ffe`06ac2a02 488b12  mov     rdx,qword ptr [rdx]
00007ffe`06ac2a05 48b9902e00186c020000 mov rcx,26C18002E90h
00007ffe`06ac2a0f e8fc85bb5f      call    coreclr!JIT_CheckedWriteBarrier (00007ffe`6667b010)
00007ffe`06ac2a14 90      nop
00007ffe`06ac2a15 4883c420add     rsp,20h
00007ffe`06ac2a19 5d      pop     rbp
00007ffe`06ac2a1a c3      ret

JIT_CheckedWriteBarrier的原型如下:

extern "C" HCIMPL2_RAW(VOID, JIT_CheckedWriteBarrier, Object **dst, Object *ref)

很明顯,他這就是把ref指向的object完整的傳遞給dst。也就是賦值給靜態字符串a。寄存器rcx表示dstrdx表示ref。此處可以通過!dumpobj rdx來查被看對象。

那么總結下,.CCtor的作用就是把靜態的全局變量對象進行一個初始化,這個結果也說明,靜態全局變量不是在CLR初始化的時候初始化,而是在當前類的.CCtor里面初始化的。

以上就是.Net 7函數Ctor與CCtor使用及區別詳解的詳細內容,更多關于.Net 7函數Ctor CCtor的資料請關注其它相關文章!

標簽: ASP.NET
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产毛片一区| 99久久婷婷国产精品综合| 日韩毛片一二三区| 欧美精品一区三区在线观看| 欧美三级电影在线观看| 亚洲午夜电影在线观看| 国产精品v欧美精品v日本精品动漫| 久久综合色之久久综合| 成人午夜视频网站| 日韩一级二级三级精品视频| 精品亚洲欧美一区| 欧美综合一区二区| 免费在线视频一区| 日本道免费精品一区二区三区| 亚洲永久精品大片| 国产精品美女诱惑| 亚洲视频每日更新| 亚洲视频久久| 国产精品久久福利| 亚洲h动漫在线| 中文字幕亚洲在| 欧美精品一区三区在线观看| 国产乱人伦偷精品视频免下载 | 黑人巨大精品欧美黑白配亚洲| 欧美亚洲动漫精品| 久久99精品久久久久久动态图| 在线观看91视频| 美腿丝袜亚洲色图| 欧美三级电影网| 久久精品国产精品亚洲精品| 欧美在线免费视屏| 国内国产精品久久| 91精品国产丝袜白色高跟鞋| 风流少妇一区二区| 久久久蜜桃精品| 欧美日韩视频在线一区二区观看视频 | 国产精品资源在线看| 欧美精品久久天天躁| 国产曰批免费观看久久久| 日韩女优av电影| 91免费视频网| 成人欧美一区二区三区在线播放| 亚洲欧洲一区二区天堂久久| 亚洲激情在线激情| 99久久精品国产麻豆演员表| 欧美videos中文字幕| 不卡欧美aaaaa| 欧美性受xxxx黑人xyx| 免费在线欧美视频| 欧美少妇bbb| 成人免费视频播放| 最新日韩在线视频| 国产精品日韩欧美一区二区三区| 中文字幕一区二区日韩精品绯色| 99在线热播精品免费| 先锋影音久久久| 欧美中文字幕一区二区三区亚洲| 26uuu国产一区二区三区| 欧美日韩爆操| 黄色日韩三级电影| 91色porny在线视频| 亚洲欧洲美洲综合色网| 久久久福利视频| 青青草97国产精品免费观看 | 性做久久久久久免费观看欧美| 国产女主播一区二区| 久久成人免费网站| 欧美精品一区二区三区蜜桃| 一区福利视频| 久久国产综合精品| 国产午夜精品久久久久久久| 国产欧美日韩亚洲| 国产曰批免费观看久久久| 国产欧美日韩三级| 久久久久国产精品午夜一区| 国产电影一区二区三区| 国产精品国产三级国产普通话蜜臀| 久久精品亚洲一区二区| 国产成人免费在线观看不卡| 亚洲三级电影网站| 欧美视频你懂的| 成人免费精品视频| 一区二区在线观看视频| 欧美午夜精品一区二区三区| 91啪九色porn原创视频在线观看| 亚洲综合色网站| 91麻豆精品国产91久久久使用方法 | 成人av集中营| 亚洲精品国久久99热| 6080午夜不卡| 亚洲激情偷拍| 国产精品一品视频| 一区二区三区在线观看国产| 日韩一级片在线播放| 一区二区欧美日韩| 国产精品1区2区3区| 亚洲男人的天堂在线aⅴ视频| 欧美日韩三级一区二区| 欧美先锋影音| 久久99国产精品免费网站| 中文字幕国产精品一区二区| 欧美撒尿777hd撒尿| 激情91久久| 国产大片一区二区| 亚洲午夜免费视频| 日韩欧美国产系列| 亚洲欧美清纯在线制服| 美女精品国产| 国产亚洲欧洲997久久综合| 国产精品狼人久久影院观看方式| 久久精品五月婷婷| 成人性生交大合| 三级久久三级久久久| 中文成人av在线| 777奇米成人网| 国产麻豆日韩| 欧美日韩一区二区三区在线观看免| 蜜桃久久久久久久| 国产精品入口麻豆原神| 7777精品伊人久久久大香线蕉完整版 | 国产免费成人在线视频| 日韩成人免费电影| 久久一区精品| 欧美性受xxxx| 久久久久久久久伊人| 久久国产毛片| 国外精品视频| 国产精品亚洲午夜一区二区三区| 亚洲精品国产一区二区精华液 | 在线一区二区三区做爰视频网站| 国产综合精品| 成人高清av在线| 激情成人午夜视频| 午夜在线成人av| 欧美韩国日本综合| 欧美一激情一区二区三区| 久久精品日韩| 亚洲激情国产| 欧美成人蜜桃| 成人性生交大片免费看中文网站| 日韩av午夜在线观看| 一区二区视频在线看| 欧美国产欧美亚州国产日韩mv天天看完整| 日韩一区二区三区电影在线观看 | 亚欧美中日韩视频| 亚洲二区免费| 欧美色欧美亚洲另类七区| 丁香激情综合五月| 精品一区二区三区免费视频| 亚洲电影一级片| 亚洲乱码国产乱码精品精小说| 国产性做久久久久久| 精品日韩一区二区三区| 777色狠狠一区二区三区| 欧美在线观看视频在线| 久久久久高清| 国产精品尤物| 亚洲精品久久久久久一区二区| k8久久久一区二区三区 | 日韩午夜小视频| 欧美日韩国产大片| 欧美日韩国产一级片| 久久综合九色综合久99| 在线综合欧美| 亚洲小说欧美另类社区| 欧美片第1页综合| 99在线精品视频| 岛国精品在线播放| 国产麻豆一精品一av一免费| 久久91精品国产91久久小草| 奇米影视在线99精品| 免费观看在线综合| 视频一区二区中文字幕| 亚洲成人你懂的| 亚洲伊人色欲综合网| 欧美精品一区二区三区视频| 国产精品av一区二区| 亚洲婷婷综合色高清在线| 国产精品一区一区三区| 伊人狠狠色j香婷婷综合| 国产精品白丝在线| 国产精品视频免费看| 亚洲国产精品激情在线观看| 精品久久久久一区| 2020日本不卡一区二区视频| 久久久精品免费网站| 亚洲国产高清在线观看视频| 国产精品久久久久久久久快鸭| 中文字幕第一区二区| 亚洲少妇最新在线视频| 一区二区视频免费在线观看| 一区二区三区丝袜| 亚洲不卡在线观看| 秋霞午夜av一区二区三区| 秋霞午夜鲁丝一区二区老狼| 狠狠色狠狠色综合| 国产91在线|亚洲| 色综合视频在线观看| 欧美日韩一区在线视频| 亚洲国产合集|