zoukankan      html  css  js  c++  java
  • 如何阅读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_msvcsrcmsvcbuild.bat,搜索/O2,将/O2改为/Od
    3.在win64版本的visual studio命令行,执行一次msvcbuild.bat debug,这时会生成luajit.exe,测试一下exe是否正常。
    4.用visual studio建立一个命令行工程,例如工程保存在LuaJIT-2.1.0-beta2_msvcluajitcmd
    5.把LuaJIT-2.1.0-beta2_msvcsrc下所有.h和.c代码加入工程
    6.把工程的调试路径设置为
    命令:$(ProjectDir)....srcluajit.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, 机器码),可见其复杂程度。
    (待续)
    UDD.William @ http://www.gamesci.com.cn/
  • 相关阅读:
    重定向与转发比较
    servlet_5
    servlet_4
    servlet_3
    字符串的操作以及格式化的操作
    2019的Python
    函数2
    函数
    文件操作
    集合 set
  • 原文地址:https://www.cnblogs.com/zwywilliam/p/6023246.html
Copyright © 2011-2022 走看看