赞
踩
记录一下, 谨防遗忘
首先, 需要在vscode安装好EmmyLua插件, 也可以在 官方链接: Visual Studio Code>Programming Languages>EmmyLua 里下载合适版本.
打开找到的lua脚本, 在vscode中使用快捷键 ctrl + shift + P , 打开如下界面,
在输入框中输入emmylua, 筛选emmylua选项, 选择 EmmyLua:InsertEmmy Debugger Code, 然后选择合适自己平台的 X86或 X64选项, 插入启动代码. 启动代码如下
package.cpath = package.cpath .. ";c:/Users/Dell/.vscode/extensions/tangzx.emmylua-0.8.1-win32-x64/debugger/emmy/windows/x64/?.dll"
--这里是我windows的地址, 你生成的代码会是你自己的地址
local dbg = require("emmy_core")
dbg.tcpListen("localhost", 9966)
新建调试配置, (没有launch.json需要创建, 点击即可)
调试器选择EmmyLua New Eebugger
一顿操作后, 我的launch.json 文件
//launch.json 文件 { // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "emmylua_new", "request": "launch", "name": "EmmyLua New Debug", "host": "localhost", "port": 9966, "ext": [ ".lua", ".lua.txt", ".lua.bytes" ], "ideConnectDebugger": true } ] }
好了, F5开始调试吧
(若有问题参见下文)
解决方法:即在插入代码:local dbg = require(“emmy_core”)前加入上述红框代码。
其中,Scripts/Lua/ 为vscode项目工程根目录至lua目录的路径。该段代码中,vscode打开的文
件夹是Assets,且lua目录在Assets\Scripts\Lua下。
emmy = {}
function emmy.fixPath(path)
return "Scripts/Lua/"..path..".lua"
end
原理简单说明:
lua代码中通过 local dbg = require(“emmy_core”) 主动加载 emmy_core.dll
到宿主程序中,并启动调试内核代码。调试内核通过socket与IDEA/VSCode侧连接通
讯。
注意:Windows下的emmy_core.dll 分32位和64位,注意区分
启动顺序的要求:
上面提到调试内核与 IDEA/VSCode 通过socket通信,有 Server端和 Client
端角色之分,所以提供了两种连接模式和对应的启动顺序要求:
1. Debugger connect IDE: 即IDE充当Server侧,这时应先启动IDE侧的调试功能
,等待被调试的程序启动并主动连接到IDE。注意:此时插入的Lua代码应当是
dbg.tcpConnect(‘localhost’, 9966)
2. IDE connect debugger: 即被调试的程序充当Server端,这时被调试的程序应
先启动,再启动IDE侧的调试功能连接到调试内核。注意:此时插入的Lua代码应
当是 dbg.tcpListen(‘localhost’, 9966)
Q: 不能连接的问题:
IDEA 提示相关错误: Connection refused: connect
原因:没有按启动顺序要求启动Server端
解决思路:按照 “启动顺序的要求” 先启动被调试的程序
Q: 不能断点的问题:
IDEA/VSCode 下了断点但不能命中:
1. 首先检查使用最新版本emmy_lua插件,群里的版本比较新,但想要最新的最好是
去CI上去下载每日构建版本,地址见群公告
2. 不能断点的大部分原因是你的宿主代码中(c++/c#)对于类似 load 函数的调用中
的 chunkname 的值给的不正确,导致文件路径不匹配而不能命中断点。例如代
码用到了 require(“a.b.c”) ,那么在加载 c.lua 文件时给的 chunkname
参数应当是 “a/b/c.lua”
另外调试器提供了一个“强断”的功能,即在要断点的地方写上lua代码:dbg.breakHere()
用这个功能可以查看强断后堆栈里显示的路径正不正常
Q: Mac上提示 ‘dynamic libraries not enabled;check your lua installation’
这个问题需要重新编译lua c代码所在的模块,加上编译宏: LUA_USE_MACOSX。(Unity下
下的xlua.bundle/tolua.bundle替换之后要重启Unity)
Q: local dbg = require(“emmy_core”) 失败报错
你的代码里写了自定义的loader,emmy_core并不是一个lua文件,请判断一下,如果加载的
是emmy_core请不要处理也不要报错,交由低层的clib loader继续处理
Q: local dbg = require(“emmy_core”) 返回一个boolean值
emmy_core库初始化失败,通常是发生在windows平台下。这是因为emmy_core在初始化会
根据lua函数名字去找函数地址,如根据"lua_settop"去找内存中的函数地址,如果找不到则会
导致初始化失败,通常是因为lua相关的函数没有被导出
解决方法1:让你的程序导出lua符号表(加上编译宏LUA_BUILD_AS_DLL)
解决方法2:选择使用自带lua代码版本的emmy_core.dll(下个版本)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。