为什么要看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. python布尔类型和逻辑运算

    布尔类型 python中True表示真,False表示假,它们是布尔类型: >>> type(True) <class 'bool'> 在python中,bool的Tru ...

  2. mysqldump备份(Windows)

    先说下思路,每天凌晨1点备份线上云服务器上的MySQL数据库,将备份的sql文件拷贝下来. 第一步:通过搜索引擎搜索相关可借鉴的文章.搜索关键字"Windows MySQL 备份" ...

  3. CLR via c# 值类型“不可变”

    昨天看书看到引用类型和值类型,书中讲到值类型“不可变”,如图: 看了两遍没怎么看懂,又仔细多看了几遍,说下我的理解: 比如说一个int类型有几个成员, MaxValue.MinValue的值是不可变的 ...

  4. c#的WebService和调用

    WebService: 1.新建一个空白web应用程序 2.在上面建立的web应用程序添加web服务 4.保存发布至 IIS Client: 1.新建一个程序(可以是winform.控制台.web) ...

  5. 【开源程序(C++)】获取bing图片并自动设置为电脑桌面背景

    众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...

  6. JSJ—类与对象

    当你在设计类时,要记得对象时靠类的模型塑造出来的,你可以这样看: ——对象是已知事物 ——对象会执行的动作 对象本身已知的事物称为实例变量,它们代表对象的状态(数据),且该类型的每一个对象都会独立的拥 ...

  7. wp rest api 授权方法步骤(使用JWT Authentication插件)

    环境:wordpress 4.7 以上,WP自带的 rest api v2 目标:使用javascript与wp rest api交互,其中编辑.新增.删除等需要Oauth认证授权 方法: 步骤一:  ...

  8. 2; HTML 基本结构

    1. HTML 的基本结构 2. HTML 控制标记的格式 3. 最常用的控制标记 本章讲解最基本的 HTML 元素,也就是创建文档结构所需的元素.例如:标题.段落. 页面分隔.注释等等. 2.1 H ...

  9. Python 执行 mysql 存储过程

    mysql 创建简单的临时表 tmp create database test; use test; DROP TABLE IF EXISTS `tmp`; CREATE TABLE `tmp` ( ...

  10. 【读书笔记】iOS-更改编辑器键的绑定

    一,Xcode-->Preferences--->Key Bindings. 参考资料:<Xcode实战开发>