2023-04-14 lua + C动态库交叉debug
lua + C动态库交叉debug
- 前言
- 一、前期准备
- 二、lldb注入进程
- 总结
前言
lua 可以方便的使用 C 编译的 dll 库, 但是先前由于只写 C 或 lua, 较少联合调用, 不太清楚如何进行交叉 debug, 也是各种搜索, 完全没有相关信息, 只好自己摸索, 所幸不难, 窗户纸一捅就破.
一、前期准备
我是用vscode + lldb + clang 工具链编译share dll, 前期没有注意, 编译 dll 时候少了一个参数, 更准确说是参数不那么正确, 导致的低级错误.
由于编译dll时, 没有加 -g, 这个低级错误导致了根本没有断点可以执行. 改正之后发现也不对, 几经周折, 参数改为 -glldb, 专为lldb做符号的debug版本, 终于OK了.
clang -glldb -shared unicodeLua.c -o E:\Learn\unicodeLua.dll -llua -Wall
当然这都是后话, 最先处理的是 debug 注入.
二、lldb注入进程
因为一直是单文件, 单语言开发, 没有使用过 attach 注入的方式进行 debug 所以先学习了一下这种操作, 需要在 vscode 下加一个 attach 方式的 launch 设置:
{
"type": "lldb",
"request": "attach",
"name": "Attach",
"pid": "${command:pickMyProcess}", // use ${command:pickProcess} to pick other users' processes
}
非常简单, 没有编译选项, 只有附加需求和pid选择.
lua端可以用正常的独立文件debug, 所以无需改 launch
具体步骤, 首先启动 lua 的 debug 程序, 当在进程中发现 lua.exe 已经加载, 启动C语言的 lldb debug程序, 用attach选项, 此时会弹出选择进程对话框, 选择 lua.exe 进程, 通常它的名字会跟在很长一段vscode插件目录之后, 搜索lua就可以找到, 同时包含lua的进程可能有多个, 一定要选 lua.exe , 这才是lua解释器, 连接后所有C程序断点暂时不可用, 直至到 lua 开始引入 dll 库, 此时会自动跳到C程序的断点, 继续一步一步的debug就可以了.
另外我用的debug插件是Lua Debug actboy168, 好像并不是所有debug插件都支持交叉debug, 所以如果不行, 可以换一个插件看看.
总结
希望通过这篇文章, 帮助你解锁不同语言相互调用的交叉debug技能, 前面风雨交加, 我辈毅然任重而前行.