为什么要看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. MyBatis源码解析(一)——执行流程

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6603926.html 一.MyBatis简介 MyBatis框架是一种轻量级的ORM框架, ...

  2. 【学习笔记】node.js重构路由功能

    摘要:利用node.js模块化实现路由功能,将请求路径作为参数传递给一个route函数,这个函数会根据参数调用一个方法,最后输出浏览器响应内容 1.介绍 node.js是一个基于Chrome V8引擎 ...

  3. 连接MySQL的10060错误:Can't connect to MySQL server on '*.*.*.*'(10060)

    使用MySQL的图形界面管理工具Navicat for MySQL连接Mysql数据库时提示错误:Can't connect to MySQL server (10060) [出现该问题可能的原因:] ...

  4. ASPxGridView中Command列自定义按钮点击事件概要

    其中CustomButtonClick="ButtonClick",e.buttonID可以获取到自定义按钮的id e.visibleIndex获取到行的索引 grdList.Ge ...

  5. Android Studio 学习(三) 广播

    动态注册监听网络变化 创建intentFilter 并addAction 代表了监听哪个广播 然后使用registerReceiver()方法 将intentFilter 与 自己创建的监听器 传进去 ...

  6. Java中单例实现

    1:.经典懒汉: 代码如下: package org.pine.test; public class Person { private String name; private int age; pu ...

  7. jfinal框架学习过程

    刚刚学习jfinal,通过一天左右的时间大体上理解了这个框架的用法,我对他的理解是JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功 ...

  8. dpr,ppi,dip,viewport的一些概念

    一 ppi,dpr,dip,分辨率,屏幕尺寸,设备物理像素,设备独立像素 分辨率:1920px*1080px 在这个设备上纵向上有 1920个像素点(色块)... 屏幕尺寸:5英寸(in) = 5*2 ...

  9. 支持MPI的hdf5库的编译

    作者:朱金灿 来源:http://blog.csdn.net/clever101 因为最近要研究并行I/O,据说hdf5文件格式可以支持并行I/O,深度学习框架Caffe用的是hdf格式,所以决定把h ...

  10. MyBatis-Plus初步使用

    在使用mybatis的过程中,我们会发现需要自己写很多的mapper和mapper.xml配置文件,很多时候会写到相当多的重复代码,特别是普通的增删改查,这样不仅会影响我们的开发效率,也会使得代码变的 ...