lua学习笔记(4)-- 搭建mobdebug 远程开发环境
近期參與公司的項目重構太忙了。很久都沒更新博客,今天整理一下最近的 關于lua部分的實現,希望給后來的人一個參考吧。
項目的資料會開源在這 這里 不要在跟我要代碼了!
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 test1.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 分別對應上述的三種事件 ,如果要公式注冊上述的三個事件 那么代碼如下:
3. 搭建lua 調試環境
通過上面 我們已經知道了 我們可以通過注冊鉤子函數監控代碼的執行過程。
那么 如何進行調試呢 ? 接下來就是介紹 一個調試的工具 mobdebug
從下面的地址 直接拿到mobdebug 的源碼
簡單的改改現在的代碼去試運行
這里提示的就是說 找不到socke組建
3.1 下載socket 組件源碼
從這個地方下載一份最新的 luasocket 源碼,這個可以編譯一份可以用的 動態庫!
https://gitee.com/mirrors_addons/luasocket.git3.2 編譯出來socket 庫
接下來就是對代碼進行一定程序的改造
注意 我的編譯的過程中不是很順利 所以 我就直接自己寫了一個cmake 去用自己的方法編譯了!
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 工具拿到
如果拿不到也可以去我的gitee 看一下 我應該會隨著代碼一起放進去的 。(這個軟件包下載起來速度很慢!)
軟件安裝好了應該是這樣的, 接下來我們簡單的試一下調試
先將 test.lua手動的復制到 windows 的電腦上,然后開啟調試的服務器
在windows 上查看自己的內網ip( 如果是其他環境 自己去決定自己的ip 吧 我的是 自己的服務器和電腦在一個內網中 且能直連, 之前的測試中也嘗試過不同的 機器一起調試 使用的是 將本地的端口暴露到公網上 比較危險!)
win + R 彈出 運行框,然后輸入 cmd 進入命令行 再 輸入 ipconfig 查看自己的網絡信息
接下來修改自己服務器上的 腳本里面的ip
接下來 調用器服務器上的 腳本。
當 你在windows 上的調試終端 出現了一個綠色的箭頭 并且指向了 你的 mobdebug 初始化之后的下一行 那么你的調試工作就可以開展了!
如果提示你 連接不上的話 建議查看 自己的防火墻,就是裝了調試終端的主機的防火墻。!
3.5 嘗試進行命令行交互
linux 的服務器上 多了一行的打印
調試的終端 上的行號移動了一行
這里其實還有一個問題沒解決,就是文件的同步問題,顯然 我們希望的是能同步的進行調試,如果要進行 linux + windows 的聯合調試的話 我這邊想到了以下的幾種方案:
我這邊比較傾向于使用samba的方案,可操作性性比較強,安裝簡單,即便是嵌入式的設備也可以安裝 一個裁剪之后的samba 服務。
總結
以上是生活随笔為你收集整理的lua学习笔记(4)-- 搭建mobdebug 远程开发环境的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 官方 AppStore 下载的 OS X
- 下一篇: Kubernetes 【安全】-Syst