成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析Hello World源碼是如何被Mono執(zhí)行

開發(fā) 后端
很多程序員可能是第一次接觸開源項目Mono,今天我們就從最簡單的Hello World源碼開始分析Mono的執(zhí)行機(jī)制。

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

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

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

一、先簡單的看下Mono源碼的目錄中的幾個重要文件夾:

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

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

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

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

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

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

二、切入正題,打斷點分析源碼

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

  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,原來是取是否要線程安全的。   
  9.  mono_jit_compile_method_with_opt:mini.c   
  10. mono_jit_compile_method_inner:MONO_USE_AOT_COMPILER   
  11. mono_compile_create_vars這個創(chuàng)建私有作用域的變量嗎?   
  12. mono_method_get_header獲取_MonoMethodHeader是做什么的?   
  13.  mono_arch_create_vars指定特定arch的操作。   
  14.  mono_method_to_ir:mono_method_to_ir.c這個好生疏阿。Translate the .net IL into linear IR   
  15.  mono_method_to_ir是一個很重要的方法,在這里實現(xiàn)了il的解析。   
  16.  mono_optimize_branches:優(yōu)化分支,開始執(zhí)行代碼優(yōu)化了,編譯理論書上寫的沒錯。  

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

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

  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  

再看看后面幾個的調(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里,這個代碼里有MonoLimitation和#if NET_2_1 && !MONOTOUCH部分符號,有點意思。

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

  1.  MonoObject *(*runtime_invoke) (MonoObject *thisvoid **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);  

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

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

原文鏈接:http://www.cnblogs.com/zffl/archive/2011/03/13/1983007.html

【編輯推薦】

  1. 使用開源工具M(jìn)onoDevelop開發(fā)GTK#圖形界面
  2. 詳解Mono 2.8上如何部署ASP.NET MVC 2框架
  3. 詳解在Mono中如何創(chuàng)建ASP.NET程序
  4. Mono2.0發(fā)布 Linux下的.NET框架成熟嗎?
  5. 討論:Mono這只猴子招惹了誰? 
責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2009-08-11 10:32:23

什么是Groovy

2012-08-27 09:10:05

JVMJava

2014-09-17 11:45:20

iOS編程App運作

2016-09-21 12:56:31

JavascriptWeb前端

2021-03-30 13:48:47

WebAssemblyWeb瀏覽器編程語言

2014-12-19 10:07:10

C

2017-11-23 17:45:46

Yii框架IntelYii框架深度剖析

2017-11-28 16:57:18

2012-02-20 14:26:48

JavaPlay Framew

2009-07-30 13:21:17

Scala入門Hello World

2023-01-06 08:18:44

2023-09-04 07:30:03

Wasm匯編語言

2009-09-16 17:15:19

OSGi Bundle

2011-06-08 14:39:06

Qt 教程

2009-08-14 16:54:19

C# Hello Wo

2021-11-26 08:22:01

Java動態(tài)開發(fā)

2011-08-05 09:48:46

iPhone Interface

2024-04-11 13:13:27

2014-04-11 11:36:42

NDKAndroid開發(fā)終端

2023-05-23 08:01:10

Netty網(wǎng)絡(luò)通信
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: www.v888av.com| 中文字幕视频在线免费 | 一区二区三区在线播放 | 爱爱小视频 | 国产大片黄色 | 91在线第一页 | av片毛片| 久久99精品久久久久久 | 国产精品爱久久久久久久 | 亚洲网在线 | 欧美亚洲国语精品一区二区 | 久久91av | 日韩欧美专区 | 亚洲综合视频 | 国产欧美视频一区二区三区 | 国产精品久久久久久久久久妞妞 | 欧美一区二区三区视频在线观看 | 成人免费大片黄在线播放 | 欧美成人精品在线 | 日韩中文字幕第一页 | 天天操狠狠操 | 中文字幕成人网 | 在线观看中文字幕 | 天天操夜夜操 | 日本精品视频一区二区 | 天天干天天爱天天爽 | 精品欧美色视频网站在线观看 | 国产视频精品免费 | av网站免费 | 正在播放国产精品 | 国产精品精品3d动漫 | 精品网 | 玖玖免费| 天天夜天天操 | 成人精品一区 | 亚洲午夜av久久乱码 | av资源网站 | 91偷拍精品一区二区三区 | 九九热在线视频 | 欧美精品日韩精品国产精品 | 人和拘一级毛片c |