如何閱讀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, 機器碼),可見其復雜程度。
(待續)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM