如何閱讀luajit的代碼——用vs調試篇

爲何要看luajit的源碼
做爲目前最快的腳本語言之一,luajit確實是一個傑做,但相比原生lua僅僅幾萬行的代碼而言,luajit卻能夠說是巨無霸。更要命的是,luajit之因此快,是由於大量使用了機器碼相關的技術,不管是它的機器碼編譯部分,仍是字節碼執行部分,讀起來都很是麻煩。
網上這方面的資料很是少,即便是lua社區的雲風大大也主要以分析原生lua爲主,跟luajit有不少不一樣。萬一遇到了性能坑,或者其餘難以解決的問題,須要找到緣由,又不能閱讀源碼的話,就只能依賴網上其餘人的結論,不然徹底無從下手。
 
調試luajit
萬事的開頭,從可以本身調試代碼開始
一個能調試的代碼,閱讀起來會遠遠比眼看要清晰得多。
而若是能利用visual studio進行調試,那麼對讀luajit而言仍是很是有幫助的,畢竟藉助visual assist的代碼查找,可以很是快的幫你找到你想了解的東西
 
luajit下面提供了一個msvcbuild.bat用於編譯luajit,但若是你須要調試的話,能夠進行如下幾個步驟:
1.將luajit解壓,好比解壓到LuaJIT-2.1.0-beta2_msvc目錄
2.若是要獲得精確的棧,修改LuaJIT-2.1.0-beta2_msvc\src\msvcbuild.bat,搜索/O2,將/O2改成/Od
3.在win64版本的visual studio命令行,執行一次msvcbuild.bat debug,這時會生成luajit.exe,測試一下exe是否正常。
4.用visual studio創建一個命令行工程,例如工程保存在LuaJIT-2.1.0-beta2_msvc\luajitcmd
5.把LuaJIT-2.1.0-beta2_msvc\src下全部.h和.c代碼加入工程
6.把工程的調試路徑設置爲
命令:$(ProjectDir)..\..\src\luajit.exe
工做目錄:$(ProjectDir)..\..\src\
7.此時你能夠正常按f5下斷點調試了
 
至於能夠調試什麼呢?
最簡單就是寫一個lua文件,require之,執行裏面的代碼,下斷點觀察luajit的行爲。
這裏必須說明,luajit的執行過程當中有兩大部分是沒有.c對應的:
1.有一部分代碼是經過dasm工具生成的,這部分直接經過彙編生成,沒有.c,因此沒有辦法在visual studio調試(其實也能夠,可是隻能彙編調試)。這些主要是lua虛擬機的代碼(是的,爲了快,做者hand tune彙編的方式來寫lua虛擬機)
2.luajit會經過jit模塊編譯一部分代碼變爲高度優化的機器碼,這些也是臨時生成的可執行機器碼,你只能在.c看到他們是如何生成的,但執行階段固然是沒有.c對應的。
除此之外,幾乎全部東西均可以直接vs調試:全部的編譯過程、全部的lua標準庫和api、luatable等常規數據結構、profiler,等等
 
 
下一步咱們會簡單說一下代碼結構,以及結果luajit一些基本原理來講說怎麼閱讀
尤爲是luajit的原理,若是對此毫無瞭解的狀況下,閱讀其源碼是十分困難的,由於luajit從編譯到執行的過程,走了不少步,跨越了多個模塊,涉及了三種不一樣形式的編碼(bytecode, SSA IR, 機器碼),可見其複雜程度。
(待續)
相關文章
相關標籤/搜索