1.Lua5.4 源码剖析——杂谈 之 如何调试Lua源码
2.hybridclr源代码解析
3.Stratis 源译从 ZFS、Btrfs 和 LVM 学到哪些
4.centos6安装时,码编标准分区和lvm物理卷是什么区别
Lua5.4 源码剖析——杂谈 之 如何调试Lua源码
我们有时候写了一段Lua代码,希望能通过断点调试的源译方式看一下我们的代码在执行过程中Lua虚拟机的状态与运行流程。本篇教程我将教大家Windows与Mac环境下如何配置Lua源码调试环境。码编
Lua调试环境需要有Lua源码,源译我们从官网下载源码:
Windows下Lua源码调试环境搭建
1)下载Visual Studio,码编转转源码版权可自行在官网下载最新版本即可:
2)打开VIsual Studio,源译创建一个新的码编C++控制台工程,我这里以Visual Studio 版本进行举例:
项目可任意命名,源译本例中我们命名为TestLua:
3)工程中添加Lua源码文件:
3.1)拷贝源代码文件到项目的码编文件夹,Makefile文件可以不拷贝:
3.2)把上面这些文件导入工程:
"
.h
头文件导入:导入所有".h"后缀文件到头文件文件夹中(右键头文件->添加->现有项):
"
.c
源文件导入:导入所有".c"后缀文件到源文件的源译文件夹(右键源文件->添加->现有项):
4)生成exe可执行文件:
文件都导入完成了,这时候如果按"生成"或者"F5",码编会有如下的源译报错:
这是因为除了我们创建项目工程的时候自带源文件中的一个main函数以外,Lua源码中也定义了两个Main函数。码编他们分别对应的源译是luac编译工具的启动函数和lua运行工具的启动函数。要想编译通过,我们只需要根据自己要调试目的,从3个main里面把用不到的2个main删掉或者重命名即可。
本例中,我打算在自己的main里面实现通过dofile函数执行一个Lua文件的功能,所以我不需要启动lua和luac指令控制台,所以我把他们的linux源码arch目录main函数改名:
luac.c:把main函数改名为luac_main函数:
lua.c:把main函数改为lua_main:
上述源码中多余的2个main函数都改名了,这时候已经能编译通过并生成出exe可执行文件了。
接下来我们可以开始编写自己的main函数逻辑了,打开TestLua.cpp,输入以下内容,作用是运行一个在项目目录下名字为"testlua.lua"的lua文件:
5)testlua.lua文件创建与编写:
上述代码在运行时会执行testlua.lua文件,接下来我们就需要在工程目录下创建这个将要被执行的testlua.lua文件:
打开testlua.lua文件,添加任意lua代码,这里我们简单调用print打印一句信息:
6)在Visual Studio中按“F5”开启调试,可以看到控制台被成功运行,我们的lua文件也被成功执行,打印出了信息:
7)断点调试指令OpCode:
学习过我的《Lua源码剖析 之 虚拟机》系列教程的同学应该知道Lua的指令就是各种OpCode的执行,我们可以在《lvm.c》的下面这个地方加断点再按F5重新启动程序,程序在每执行一条OpCode指令就会在这处代码断点下来,这时候我们就能看到下一条要执行的OpCode是哪一条了:
在本例中的print函数最终会执行到OP_CALL这个调用分支:
Windows环境下搭建Lua源码调试环境的教程到此结束。
Mac下Lua源码调试环境搭建
因为大部分流程与上面Windows一样,所以我下面会省略一些重复步骤。
1)下载XCode,可自行在AppStore进行下载。
2)打开XCode,创建一个新的C++控制台工程,本例中命名为TestLua:
3)工程中添加Lua源码文件:
3.1)拷贝源代码文件到项目的舟山淘小宝源码文件夹,Makefile文件可以不拷贝:
3.2)把拷贝后的文件导入工程:
不需要区分".h"和".cpp",全选导进来就好了:
4)与Windows流程同样,把源码自带的2个main函数改名:
luac.c:把main函数改名为luac_main函数:
lua.c:把main函数改为lua_main:
把源码中多余的2个main函数都改名了,接下来同样,开始编写我们的main.cpp,打开该文件并添加代码如下代码。为了在mac下文件读取代码更简洁,在下面的Lua文件我暂时先使用文件的绝对路径,暂时把testlua.lua文件放在我的mac的桌面上进行读取:
5)在mac的桌面上创建testlua.lua文件,添加任意lua代码:
6)同理可正常运行或者加断点进行调试,这里不再赘述:
总结
本文我们学习了如何在Windows与Mac下搭建Lua源码调试环境。另外,我们上述使用的例子是通过dofile运行一个lua文件,同学们也可以试试保留lua.c里面的main函数,删掉另外两个,此时按开始调试可启动lua的即时解析控制台,在控制台里面可自行输入任意Lua代码,并可断点查看即时运行状态或最终结果,感兴趣的同学可以自行试试。
不过,尽管能调试Lua源码,上饶离抚州源码但如果之前没有学习过我的那些Lua源码剖析教程,可能很多地方会看不懂,所以这里建议有空的同学还是可以先去学习一下的。
谢谢阅读。
hybridclr源代码解析
基于lua的unity热更新解决方案
使用lua5.3.5,可以通过VS进行调试,lparser.c负责解释lua源代码,LClosure *luaY_parser函数是解释lua源码的入口。llex.c中的llex函数负责词法分析,而lparser.c中的statement函数进行语法分析。lvm.c则用于执行lua代码。观察到lua需要第三方插件以查看性能,其基于寄存器的虚拟机性能优于ilruntime,但与unity交互成本高,依赖于lua的堆栈交互。
流行解决方案如XLua和ToLua,XLua在处理如Vector3等结构体时,避免了不必要的拆箱和装箱操作,ToLua则直接在lua代码中实现了与C#类似的Vector3数据结构。
基于ilruntime的unity热更新解决方案
ilruntime的下载地址为github.com/Ourpalm/ILRuntimeU3D。它提供了unity示例工程,钻石趋势分析源码其中ImageReader.cs负责加载dll,而ilruntime使用Mono.Cecil来读取dll的PE信息。从2.0版本开始,ilruntime引入了寄存器模式以解决数值计算效率问题,分为按需JIT(ILRuntimeJITFlags.JITOnDemand)和立即JIT(ILRuntimeJITFlags.JITImmediately)两种模式。ILIntepreter.cs用于执行il代码,非寄存器模式下,Execute函数负责执行代码,而寄存器模式下的ExecuteR函数实现相同功能。然而,所有解决方案的虚拟机与il2cpp相互独立,导致元数据不相通,影响了与unity类的集成,需要额外封装和跨域访问处理。ilruntime支持大部分C#语法,但使用时需注意避免一些陷阱。
基于hybridclr的unity热更新解决方案
hybridclr提供了unity示例工程,官方博客地址为hybridclr.doc.code-philosophy.com...,使用手册可参考介绍 | HybridCLR。建议在vs和unity.3.0f1环境下调试PC工程。加载dll的两个主要入口在于.metadataModule.cpp中的LoadMetadataForAOTAssembly函数和RawImage.cpp读取原始信息,随后Image.cpp解析dll信息并翻译成il2cpp类型,AOTHomologousImage.cpp和ConsistentAOTHomologousImage.cpp分别用于封装加载过程,确保一致性或超集程序集的灵活管理。Assembly.cpp的Il2CppAssembly* Create函数解析PE头、CLR头和元数据以得到镜像信息,随后初始化metadata和interpreter模块以提供快速访问和执行速度。
hybridclr的优势在于直接使用il2cpp的内存对象,避免跨域问题;利用C#语言特性进行开发;并能够使用unity自带的profiler工具查看性能。
Stratis 从 ZFS、Btrfs 和 LVM 学到哪些
深入剖析Stratis,一个卷管理文件系统,它在设计时借鉴了ZFS、Btrfs和LVM的长处,旨在提供一种强大而不复杂的本地存储管理系统。
在深入探讨Stratis之前,我们先了解已有的解决方案,包括ZFS和Btrfs。ZFS,由Sun Microsystems为Solaris开发,后移植至Linux,但因CDDL协议授权的代码无法合并到GPL协议授权的Linux源码树中,从而使其在企业级Linux供应商中难以得到广泛支持。而Btrfs,作为众多用户心目中的“最佳文件系统”,虽无授权问题,但在稳定性和功能特性上仍有提升空间。
正是这些挑战激发了Stratis的诞生。Stratis旨在打破现状,解决ZFS和Btrfs的种种问题。它选择采用Linux内核的其他已有特性,如device mapper子系统以及久经考验的高性能文件系统XFS,来创建存储池,而不是从零开始构建一个内核支持的VMF文件系统。
在借鉴ZFS的思路中,Stratis设定了最初的开发目标,学习了用户对下一代文件系统的预期。同时,它也意识到应避免ZFS的某些设计,例如在挂载来自其他主机的存储池时需要进行“导入”步骤。此外,Stratis希望改进ZFS在增加新硬盘或替换硬盘时的限制,尤其是在存储池已进行冗余配置的情况下。
在Btrfs方面,Stratis欣赏其单一的命令行工具,以及对冗余的处理方式,如Btrfs profiles,允许用户在添加或移除硬盘时有更多的灵活性。Stratis还借鉴了ZFS和Btrfs在快照实现、对发送/接收的支持上的共性,以定义其自身的特性和功能。
通过研究LVM,Stratis了解到与之共享的大量特性,如使用DM以及如何处理磁盘元数据格式。然而,与LVM相比,Stratis的设计更注重用户友好性和易用性,而非为专业用户提供精确的卷组配置选项。
Stratis的设计考虑了不同用户的需求,提供了一种尝试满足其需求的本地存储管理解决方案。它强调了自由和开源软件带来的好处,即每个组件都是开源的,可以自由查看和修改源代码,用户可以根据自身需求选择最适合的工具。
综上所述,Stratis通过借鉴ZFS、Btrfs和LVM的经验,旨在提供一个强大、简单且易于使用的本地存储管理系统,以满足用户对本地存储管理解决方案的需求。
centos6安装时,标准分区和lvm物理卷是什么区别
二者无法比较,因其概念性质不同。标准分区就是用来实现系统启动、虚拟内存的。多余的分区根据用户自己的需求自行划分。
LVM可以做RAID,实现硬盘的各种镜像、磁盘阵列功能。从而实现磁盘可用率提高、容错、高读写、降低冗余等用途。LVM物理卷则可以方便的动态调整分区大小,例如home分区不够用了,使用LVM就可以很方便的输入lvextend命令进行操作就可以了。
扩展资料:
CentOS 是一个基于Red Hat Linux 提供的可自由使用源代码的企业级Linux发行版本。每个版本的 CentOS都会获得十年的支持(通过安全更新方式)。CentOS是Community Enterprise Operating System的缩写。
新版本的 CentOS 大约每两年发行一次,而每个版本的 CentOS 会定期(大概每六个月)更新一次,以便支持新的硬件。
CentOS 是RHEL(Red Hat Enterprise Linux)源代码再编译的产物,而且在RHEL的基础上修正了不少已知的 Bug ,相对于其他 Linux 发行版,其稳定性值得信赖。
百度百科-centos