概述
近期参与公司的项目重构太忙了。很久都没更新博客,今天整理一下最近的 关于lua部分的实现,希望给后来的人一个参考吧。
项目的资料会开源在这 这里 不要在跟我要代码了!
https://gitee.com/jeasonb/lua_debug/
1 .从lua 源码到自己的lua 解释器
1.0 下载源码
lua的源码可以从以下的lua 官网下载
http://www.lua.org/
执行以下的指令可以编译lua的解释器
curl -R -O http://www.lua.org/ftp/lua-5.4.4.tar.gz
tar zxf lua-5.4.4.tar.gz
cd lua-5.4.4
make all test
1.1 代码编译
[jeason@centos7:~/lua_debug]$
[jeason@centos7:~/lua_debug]$ tar zxf lua-5.4.4.tar.gz
[jeason@centos7:~/lua_debug]$ cd lua-5.4.4
[jeason@centos7:~/lua_debug/lua-5.4.4]$ make all test
make[1]: Entering directory `/home/jeason/lua_debug/lua-5.4.4/src'
Guessing Linux
make[2]: Entering directory `/home/jeason/lua_debug/lua-5.4.4/src'
make all SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl"
make[3]: Entering directory `/home/jeason/lua_debug/lua-5.4.4/src'
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lapi.o lapi.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c lcode.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lctype.o lctype.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ldebug.o ldebug.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ldo.o ldo.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ldump.o ldump.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lfunc.o lfunc.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lgc.o lgc.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c llex.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lmem.o lmem.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lobject.o lobject.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lopcodes.o lopcodes.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c lparser.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lstate.o lstate.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lstring.o lstring.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ltable.o ltable.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ltm.o ltm.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lundump.o lundump.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lvm.o lvm.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lzio.o lzio.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lauxlib.o lauxlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lbaselib.o lbaselib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lcorolib.o lcorolib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ldblib.o ldblib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o liolib.o liolib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lmathlib.o lmathlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o loadlib.o loadlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o loslib.o loslib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lstrlib.o lstrlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ltablib.o ltablib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lutf8lib.o lutf8lib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o linit.o linit.c
ar rcu liblua.a lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o
ranlib liblua.a
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lua.o lua.c
gcc -std=gnu99 -o lua lua.o liblua.a -lm -Wl,-E -ldl
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o luac.o luac.c
gcc -std=gnu99 -o luac luac.o liblua.a -lm -Wl,-E -ldl
make[3]: Leaving directory `/home/jeason/lua_debug/lua-5.4.4/src'
make[2]: Leaving directory `/home/jeason/lua_debug/lua-5.4.4/src'
make[1]: Leaving directory `/home/jeason/lua_debug/lua-5.4.4/src'
make[1]: Entering directory `/home/jeason/lua_debug/lua-5.4.4/src'
./lua -v
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
make[1]: Leaving directory `/home/jeason/lua_debug/lua-5.4.4/src'
[jeason@centos7:~/lua_debug/lua-5.4.4]$ ls -l ./src/lua
-rwxrwxr-x. 1 jeason jeason 281168 Jun 2 22:41 ./src/lua
[jeason@centos7:~/lua_debug/lua-5.4.4]$
1.3 简单的执行一下 看看效果
[jeason@centos7:~/lua_debug/lua-5.4.4/src]$ ./lua
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
>
> print("Hellow World!")
Hellow World!
2 . 简单的认识一下lua的钩子函数
function my_hook()
print("my_hook enter ... ")
end
-- require("debug").sethook(my_hook,"l")
print("1")
print("12")
print("123")
print("1234")
print("12345")
print("123456")
-- 输出结果如下:
-- 1
-- 12
-- 123
-- 1234
-- 12345
-- 123456
加入钩子函数之后的执行结果如下:
function my_hook()
print("my_hook enter ... ")
end
require("debug").sethook(my_hook,"l")
print("1")
print("12")
print("123")
print("1234")
print("12345")
print("123456")
-- 输出:
-- my_hook enter ...
-- 1
-- my_hook enter ...
-- 12
-- my_hook enter ...
-- 123
-- my_hook enter ...
-- 1234
-- my_hook enter ...
-- 12345
-- my_hook enter ...
-- 123456
关于钩子函数的调用方面,钩子函数支持 三种事件
①行事件 , ② 函数进入事件 ③ 函数退出事件
我用的比较多的 是行事件,好像还有一种计数事件,我没怎么用过 不是很了解 ,要想注册这些事件 ,只需要在注册钩子的时候将第二个参数 的字符串内写上对应的缩写 l f r 分别对应上述的三种事件 ,如果要公式注册上述的三个事件 那么代码如下:
function my_hook()
print("my_hook enter ... ")
end
require("debug").sethook(my_hook,"lrf")
print("1")
print("12")
print("123")
print("1234")
print("12345")
print("123456")
-- my_hook enter ... 行事件
-- my_hook enter ... 函数事件
-- 1
-- my_hook enter ... 行事件
-- my_hook enter ... 函数事件
-- 12
-- my_hook enter ... 行事件
-- my_hook enter ... 函数事件
-- 123
-- my_hook enter ... 行事件
-- my_hook enter ... 函数事件
-- 1234
-- my_hook enter ... 行事件
-- my_hook enter ... 函数事件
-- 12345
-- my_hook enter ... 行事件
-- my_hook enter ... 函数事件
-- 123456
-- my_hook enter ... 行事件
-- my_hook enter ... 函数事件
-- my_hook enter ... 退出事件
3. 搭建lua 调试环境
通过上面 我们已经知道了 我们可以通过注册钩子函数监控代码的执行过程。
那么 如何进行调试呢 ? 接下来就是介绍 一个调试的工具 mobdebug
从下面的地址 直接拿到mobdebug 的源码
https://gitee.com/mirrors_glycerine/MobDebug/blob/master/src/mobdebug.lua#
简单的改改现在的代码去试运行
这里提示的就是说 找不到socke组建
3.1 下载socket 组件源码
从这个地方下载一份最新的 luasocket 源码,这个可以编译一份可以用的 动态库!
https://gitee.com/mirrors_addons/luasocket.git
3.2 编译出来socket 库
接下来就是对代码进行一定程序的改造
注意 我的编译的过程中不是很顺利 所以 我就直接自己写了一个cmake 去用自己的方法编译了!
git clone https://gitee.com/mirrors_addons/luasocket.git
cd luasocket/
git checkout v3.0.0
mkdir build
cd build/
cmake ..
make -j
cmake 如下:
cmake_minimum_required(VERSION 3.1)
project(luasocket C)
# file(GLOB_RECURSE LUASOCKET_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.c")
# file(GLOB_RECURSE LUASOCKET_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}"/src/*.h")
add_library(socket SHARED
${CMAKE_CURRENT_SOURCE_DIR}/src/auxiliar.c
${CMAKE_CURRENT_SOURCE_DIR}/src/buffer.c
${CMAKE_CURRENT_SOURCE_DIR}/src/compat.c
${CMAKE_CURRENT_SOURCE_DIR}/src/except.c
${CMAKE_CURRENT_SOURCE_DIR}/src/inet.c
${CMAKE_CURRENT_SOURCE_DIR}/src/io.c
${CMAKE_CURRENT_SOURCE_DIR}/src/luasocket.c
${CMAKE_CURRENT_SOURCE_DIR}/src/mime.c
${CMAKE_CURRENT_SOURCE_DIR}/src/options.c
${CMAKE_CURRENT_SOURCE_DIR}/src/select.c
${CMAKE_CURRENT_SOURCE_DIR}/src/serial.c
${CMAKE_CURRENT_SOURCE_DIR}/src/tcp.c
${CMAKE_CURRENT_SOURCE_DIR}/src/timeout.c
${CMAKE_CURRENT_SOURCE_DIR}/src/udp.c
${CMAKE_CURRENT_SOURCE_DIR}/src/unix.c
${CMAKE_CURRENT_SOURCE_DIR}/src/unixdgram.c
${CMAKE_CURRENT_SOURCE_DIR}/src/unixstream.c
${CMAKE_CURRENT_SOURCE_DIR}/src/usocket.c
)
set_target_properties(socket PROPERTIES PREFIX "") # 删除前缀的 lib
set_target_properties(socket PROPERTIES SUFFIX ".so") # 设置后缀
target_include_directories(socket PUBLIC
/home/jeason/lua_debug/lua-5.4.4/src # 这里 根据实际需要进行调整 ######
)
于是经过一番的编译之后 我就有了一个 socket.so 的动态库
3.3 运行起来mobdebug
将动态库拷贝到和脚本同级的路径下(当然你也可以导出 环境变量)
cp socket.so ../../script/
再次运行 发现了 找不到一个luaopen_socket 的函数,这个是因为 我们的socket.so 并不是一个真正的 lua动态库 ,这里其实是想找一个socket.lua的 lua 脚本 我们将脚本补充上去!
[jeason@centos7:~/lua_debug/script]$ ./lua test.lua
./lua: error loading module 'socket' from file './socket.so':
./socket.so: undefined symbol: luaopen_socket
stack traceback:
[C]: in ?
[C]: in function 'require'
./mobdebug.lua:84: in main chunk
[C]: in function 'require'
test.lua:7: in main chunk
[C]: in ?
[jeason@centos7:~/lua_debug/script]$ ./lua test.lua
再次运行:
此时 除了连接补上去 没有报其他的错误了! 我们可以进一步的准备上位机的环境了
3.4 远程调试上位机的选择
上位机这里我选择的是 :zerobrane 他们的官网是这个
https://studio.zerobrane.com/
直接下载地址是这里 应该可以直接用wget 工具拿到
https://download.zerobrane.com/ZeroBraneStudioEduPack-1.90-win32.exe
如果拿不到也可以去我的gitee 看一下 我应该会随着代码一起放进去的 。(这个软件包下载起来速度很慢!)
软件安装好了应该是这样的, 接下来我们简单的试一下调试
先将 test.lua手动的复制到 windows 的电脑上,然后开启调试的服务器
在windows 上查看自己的内网ip( 如果是其他环境 自己去决定自己的ip 吧 我的是 自己的服务器和电脑在一个内网中 且能直连, 之前的测试中也尝试过不同的 机器一起调试 使用的是 将本地的端口暴露到公网上 比较危险!)
win + R 弹出 运行框,然后输入 cmd 进入命令行 再 输入 ipconfig 查看自己的网络信息
接下来修改自己服务器上的 脚本里面的ip
接下来 调用器服务器上的 脚本。
当 你在windows 上的调试终端 出现了一个绿色的箭头 并且指向了 你的 mobdebug 初始化之后的下一行 那么你的调试工作就可以开展了!
如果提示你 连接不上的话 建议查看 自己的防火墙,就是装了调试终端的主机的防火墙。!
3.5 尝试进行命令行交互
linux 的服务器上 多了一行的打印
调试的终端 上的行号移动了一行
这里其实还有一个问题没解决,就是文件的同步问题,显然 我们希望的是能同步的进行调试,如果要进行 linux + windows 的联合调试的话 我这边想到了以下的几种方案:
- linux 端实现 samba 服务,然后windows 挂载 linux 的磁盘 直接打开对应的文件 修改完 之后直接在服务器上 调用起来 这边就可以调试了。
- 在windows 安装sftp 工具,每次修改完之后 直接将改动内容发送到服务器。
- 直接在服务器上装 linux 版本的调试工具,调试完 直接服务器本地调试,当然这个需要你有服务器的root 的权限 然后装rdp 登录图形界面 或者其他的解决方案,可操作性不是很强。
我这边比较倾向于使用samba的方案,可操作性性比较强,安装简单,即便是嵌入式的设备也可以安装 一个裁剪之后的samba 服务。
最后
以上就是有魅力手机为你收集整理的lua学习笔记(4)-- 搭建mobdebug 远程开发环境1 .从lua 源码到自己的lua 解释器2 . 简单的认识一下lua的钩子函数3. 搭建lua 调试环境的全部内容,希望文章能够帮你解决lua学习笔记(4)-- 搭建mobdebug 远程开发环境1 .从lua 源码到自己的lua 解释器2 . 简单的认识一下lua的钩子函数3. 搭建lua 调试环境所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复