为什么要看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, 机器码),可见其复杂程度。
(待续)

如何阅读luajit的代码——用vs调试篇的更多相关文章

  1. Spark代码Eclipse远程调试

    我们在编写Spark Application或者是阅读源码的时候,我们很想知道代码的运行情况,比如参数设置的是否正确等等.用Logging方式来调试是一个可以选择的方式,但是,logging方式调试代 ...

  2. Kaldi阅读并更改代码

    Common utilities base/kaldi-common.h 几乎所有Kaldi程序都会include该头文件. 该头文件include了一些其他位于base/目录的头文件,主要提供: 错 ...

  3. C#学习笔记(九):函数、代码查询和调试

    代码查询和调试 代码查询 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...

  4. Pycharm实现服务器端代码的远程调试

     Pycharm是很多人在学习机器学习时的常用IDE.但是,当代码需要庞大计算资源的时候,我们往往需要借助远程服务器的GPU资源.很多人都是将代码拷贝到服务器,然后运行,但是当修改调试的时候,很不方便 ...

  5. 【转】Android LCD(四):LCD驱动调试篇

    关键词:android LCD TFTSN75LVDS83B  TTL-LVDS LCD电压背光电压 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台 ...

  6. VC调试篇

    难怪很多前辈说调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言.不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件. 我以前接触的程序大多是有比较成形的思路和方法,调试起来出 ...

  7. [转]谷歌Chrome浏览器开发者工具教程—JS调试篇

    来源:http://blog.csdn.net/cyyax/article/details/51242720 上一篇我们学习了谷歌Chrome浏览器开发者工具的基础功能,下面介绍的是Chrome开发工 ...

  8. 羽夏看Win系统内核——调试篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  9. OD调试篇3-小软件破解1

    OD调试篇3-小软件破解1 要求如下图该软件需要改5个地方,其中1.2是软件未注册而设定限定的添加个数,3.4.5是软件显示的一些未注册的信息. 一. 1.按1运行程序,添加用户添加第五个时出现提示, ...

随机推荐

  1. DynamicProxy系列目录

    C# 1.基于Emit实现动态代理 2.Microsoft.CodeAnalysis动态生成代理类 3.castle dynamicproxy + AutoFac 4.DispatchProxy .R ...

  2. Python多进程操作同一个文件,文件锁问题

    最近工作当中做了一个项目,这个项目主要是操作文件的. 在操作耗时操作的时候,我们一般采用多线程或者多进程.在开发中,如果多个线程需要对文件进行读写操作,就需要用到线程锁或者是文件锁. 使用fcntl ...

  3. Perl使用模块和@INC

    use加载模块 安装模块后,都会有对应的文档,可以通过perldoc MODULE_NAME来获取模块的使用帮助. 例如:获取File::Utils的使用帮助. perldoc File::Utils ...

  4. Java线程实现与安全

    目录 1. 线程的实现 线程的三种实现方式 Java线程的实现与调度 2. 线程安全 Java的五种共享数据 保证线程安全的三种方式 前言 本篇博文主要是是在Java内存模型的基础上介绍Java线程更 ...

  5. Keras入门(二)模型的保存、读取及加载

    本文将会介绍如何利用Keras来实现模型的保存.读取以及加载.   本文使用的模型为解决IRIS数据集的多分类问题而设计的深度神经网络(DNN)模型,模型的结构示意图如下: 具体的模型参数可以参考文章 ...

  6. Postman Post请求上传文件

    Postman Post请求上传文件一.选择post请求方式,输入请求地址 二.填写Headers Key:Content-Type :Value:multipart/form-data 如下图 三. ...

  7. 为链表数据结构实现iterator接口

    iterator作用 为所有的数据结构提供统一的访问方式. 接口对象 接口对象一共有3个方法,next()方法.return()方法.throw()方法. next() 必填 用于for..of迭代. ...

  8. C# Dev XtraReport 简单测试

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using DevExpre ...

  9. NPOI 读取Excel文件

    private void buttonExcel_Click(object sender, EventArgs e) { FileStream fs = null; List<ISheet> ...

  10. 判断浏览器的名称,区分360的ie和谷歌内核

    function getBrowserInfo() { var ua = navigator.userAgent.toLocaleLowerCase(); var browserType = null ...