日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
淺析HelloWorld源碼是如何被Mono執(zhí)行

本文目的很簡(jiǎn)單,簡(jiǎn)單分析一下下面語(yǔ)句是如何被Mono Runtime執(zhí)行的:

創(chuàng)新互聯(lián)是一家專(zhuān)注于成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),蒙陰網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:蒙陰等地區(qū)。蒙陰做網(wǎng)站價(jià)格咨詢:18980820575

 
 
 
  1. public class Hello1 
  2.  { 
  3.   public static void Main() 
  4.  { 
  5.      System.Console.WriteLine("Hello, World!"); 
  6.   } 

由于自己也是剛接觸Mono源碼,以前一直停留于簡(jiǎn)單的應(yīng)用之上,所以本文的分析不全面,只是為了能大致的了解Mono的執(zhí)行流程,對(duì)基本的函數(shù)和流程有所了解,所以本文的風(fēng)格為流水帳。

一、先簡(jiǎn)單的看下Mono源碼的目錄中的幾個(gè)重要文件夾:

我這里使用的是不知道什么時(shí)候下載的某個(gè)歷史版本2.6.7,目前我覺(jué)得重要的就3個(gè)文件夾,mcs為base framework這里除了常見(jiàn)的System namespace下的各種重要程序集之外還有以Mono作為namespace的一些程序集,聽(tīng)雨痕說(shuō)玩Mono不能錯(cuò)過(guò)這些程序集,有空看下;libgc文件夾里貌似是提供GC的支持庫(kù);最重要一個(gè)文件夾就是mono了,下面著重看下這個(gè)目錄,這里實(shí)現(xiàn)的是Mono Runtime,本文調(diào)試的代碼也主要是這里的。

1.arch:此目錄放了各種不同處理器的差異代碼,看下x86里面就兩個(gè)文件x86-codegen.h和tramp.c,這個(gè)tramp.c通過(guò)調(diào)用x86-codegen.h里的各種奇怪的宏提供了兩個(gè)方法mono_arch_create_method_pointer和mono_arch_create_trampoline,依這個(gè)名字看是由MonoMethod *method生成一個(gè)本機(jī)代碼的指針。。。不過(guò)這兩個(gè)方法太過(guò)抽象還沒(méi)看懂,先放到一邊。

2.io-layer:從這個(gè)目錄下的各個(gè)文件名來(lái)看,這個(gè)是和操作系統(tǒng)打交道的,比如posix,socket,threads,semaphores,io等等,這個(gè)我很感興趣,特別是P/Invoke是如何和這些打交道的,這一塊在以后也可以做深入的分析。

3.metadata:這一塊是實(shí)現(xiàn)cli的,比如appdomain,assembly,class&object,cominterop,exception等等,不過(guò)還有g(shù)c,coree,filewatcher等等,看來(lái)這里不只是cli的實(shí)現(xiàn),還有一堆其他的東西。

4.mini:這個(gè)名字起的很奇怪,為啥叫mini呢?我猜可能是為了和mono對(duì)應(yīng)吧。。。其實(shí)這里是Mono Runtime里最基礎(chǔ)的部分,比如aot,Linear IR的jit,debugger等等,當(dāng)然main函數(shù)也再這里。

5.utils和其他:utils提供一些基礎(chǔ)設(shè)施方面的功能,比如內(nèi)存分配方面的,常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),以及各種工具方法。其他的幾個(gè)文件夾我暫時(shí)沒(méi)發(fā)現(xiàn)有價(jià)值的東西,先擱在一邊。

二、切入正題,打斷點(diǎn)分析源碼

1.***步嘗試:找出編譯的步驟和執(zhí)行的入口,單步來(lái)分析執(zhí)行流程。在mono_main() at driver.c里找到了main_thread_handler方法,這個(gè)是mono在解析完一系列args后的調(diào)用,這個(gè)方法是入口,接著往下看,由于沒(méi)有使用mono_compile_aot,所以直接使用mono_domain_assembly_open打開(kāi)程序集,執(zhí)行mono_jit_exec。。。。具體的細(xì)節(jié)就不再寫(xiě)下去了,因?yàn)槲野l(fā)現(xiàn)這樣寫(xiě)分析的方法沒(méi)有人能看懂,我自己都懶得看。但是結(jié)果得說(shuō)一下,通過(guò)這種方式我最終也沒(méi)有找到再哪點(diǎn)輸出了Hello World!把我記的筆記貼出來(lái),換一種方法

 
 
 
  1.  mono_main:driver.c 
  2.  main_thread_handler:driver.c 
  3.  mono_jit_exec :driver.c 
  4. mono_runtime_run_main:object.c 
  5.  mono_runtime_exec_main:object.c 
  6.  mono_runtime_invoke:mini.c 
  7.  runtime_invoke:指針。 
  8.  mono_custom_attrs_from_method:reflection.c,原來(lái)是取是否要線程安全的。 
  9.  mono_jit_compile_method_with_opt:mini.c 
  10. mono_jit_compile_method_inner:MONO_USE_AOT_COMPILER 
  11. mono_compile_create_vars這個(gè)創(chuàng)建私有作用域的變量嗎? 
  12. mono_method_get_header獲取_MonoMethodHeader是做什么的? 
  13.  mono_arch_create_vars指定特定arch的操作。 
  14.  mono_method_to_ir:mono_method_to_ir.c這個(gè)好生疏阿。Translate the .net IL into linear IR 
  15.  mono_method_to_ir是一個(gè)很重要的方法,在這里實(shí)現(xiàn)了il的解析。 
  16.  mono_optimize_branches:優(yōu)化分支,開(kāi)始執(zhí)行代碼優(yōu)化了,編譯理論書(shū)上寫(xiě)的沒(méi)錯(cuò)。 

2.第二次嘗試:找到在哪執(zhí)行了向stdout上寫(xiě)hello world! 這一次直接一點(diǎn),直接去找最終的執(zhí)行函數(shù),中間的無(wú)數(shù)步驟先忽略。最初我再源碼里翻出了console-io.h這個(gè)頭文件,發(fā)現(xiàn)這里有操作console的,然后就斷點(diǎn)阿,每個(gè)相關(guān)的函數(shù)都斷上,執(zhí)行的***只有初始化函數(shù)命中了,嘗試失敗。那么到底再哪點(diǎn)往stdout寫(xiě)數(shù)據(jù)呢?我再次嘗試一種方法,在執(zhí)行時(shí)加上--trace選項(xiàng)(即再terminal里執(zhí)行mono --trace hello.exe >> hello.trace.out),把執(zhí)行流程重定向的一個(gè)文本文件中,輸出了700多行,恩,我想從這里找出點(diǎn)線索。

1.首先在hello.trace.out文件里搜索Hello, World!字符串,找到幾個(gè)匹配的地方,其中有一個(gè)是 [0xb75616f0: 0.02866 1] ENTER: System.Console:WriteLine (string)([STRING:0x53fa0:Hello, World!], ) 從這個(gè)trace的結(jié)果上可以看出,[]包括的是地址和時(shí)間,后面跟著ENTER:,于是我就再代碼里搜索ENTER:,找到/mono/mini/trace.c的342行,加上條件斷點(diǎn):fname = "System.Console:WriteLine",執(zhí)行一下,ok,命中斷點(diǎn),堆棧信息如下。

 
 
 
  1. Thread [1] 8643 (Suspended : Breakpoint) 
  2.    mono_trace_enter_method() at trace.c:342 0x80dbe6c 
  3.   0xfb817c 
  4.    0xfb8225 
  5.    0xfb80f8 
  6.    mono_jit_runtime_invoke() at mini.c:4,789 0x8065cc1 
  7.   mono_runtime_invoke() at object.c:2,613 0x8195d35 
  8.   create_exception_two_strings() at exception.c:133 0x81e6a9f 
  9.  mono_exception_from_name_two_strings() at exception.c:156 0x81e6adf 
  10.  create_exceptions() at appdomain.c:185 0x818b9e4 
  11.   mono_runtime_init() at appdomain.c:262 0x818bc0d 
  12.  mini_init() at mini.c:5,520 0x806734a 
  13.   mono_main() at driver.c:1,623 0x80ec127 
  14.  main() at main.c:34 0x805b950 

再看看后面幾個(gè)的調(diào)用

 
 
 
  1.  System.IO.SynchronizedWriter:WriteLine 
  2.  System.IO.TextWriter:WriteLine 
  3.  System.IO.UnexceptionalStreamWriter:Write 
  4.  System.IO.StreamWriter:Write 
  5. ...... 
  6. System.IO.MonoIO:Write 

都是同樣的調(diào)用堆棧,另外有關(guān)于這些System.Console相關(guān)的函數(shù)都在mono-2.6.7/mcs/class/corlib/System/Console.cs里,這個(gè)代碼里有MonoLimitation和#if NET_2_1 && !MONOTOUCH部分符號(hào),有點(diǎn)意思。

2.現(xiàn)在可以大致確定每個(gè)clr的方法調(diào)用都是由mono_jit_runtime_invoke發(fā)出的,但是我有點(diǎn)不解的是有三個(gè)函數(shù)沒(méi)有symbol,直接顯示的是函數(shù)地址,這給我的進(jìn)一步分析帶來(lái)了難度,來(lái)看看是為什么。執(zhí)行函數(shù)返回退回到堆棧mono_jit_runtime_invoke,可以看到那幾個(gè)沒(méi)有符號(hào)信息的地址是由runtime_invoke這個(gè)函數(shù)執(zhí)行的。轉(zhuǎn)到定義,可見(jiàn)

 
 
 
  1.  MonoObject *(*runtime_invoke) (MonoObject *this, void **params, MonoObject **exc, void* compiled_method); 
  2. ...... 
  3. if (!info->dyn_call_info) 
  4.    info->runtime_invoke = mono_jit_compile_method (invoke); 
  5.  ...... 
  6. runtime_invoke = info->runtime_invoke; 
  7. ...... 
  8. return runtime_invoke (obj, params, exc, info->compiled_method); 

可見(jiàn)runtime_invoke是由mono_jit_compile_method這個(gè)方法進(jìn)行jit生成的代碼,怪不得找不到符號(hào)了。

3.繼續(xù)深入到mono_jit_compile_method_with_opt這個(gè)動(dòng)態(tài)代碼生成的函數(shù),關(guān)于jit方面的,留下次分析吧。


名稱(chēng)欄目:淺析HelloWorld源碼是如何被Mono執(zhí)行
網(wǎng)址分享:http://www.5511xx.com/article/djjpppj.html