当前位置: 首页 > news >正文

VSCode 使用 EmmyLua 对lua进行调试

时间:2024年10月
其他:win10,EmmyLua v0.8.20

参考:https://blog.csdn.net/ShenHaoDeHao/article/details/140268354

有几个概念搞清楚就好理解了。一般开发中,我们编写的lua文件由宿主程序的来解析、执行;当然对于我们写的单个的测试文件,我们直接使用 lua.exe test.lua 运行即可,这里可以认为lua.exe 就是宿主程序。

EmmyLua 通过在lua代码中加载 emmy_core.dll到宿主程序中,并启动调试内核代码。调试内核通过socket与VSCode侧连互通;通信有Server端和Client端角色之分。默认情况下:

  • IDE connect Debugger 即被调试的程序充当Server端,这时被调试的程序应先启动,再启动IDE侧的调试功能连接到调试内核

另外一种就是:

  • Debugger connect IDE 即IDE充当Server侧,这时应先启动IDE侧的调试功能,等待被调试的程序启动并主动连接到IDE

我们做个简单的测试,在vscode的搜索、安装EmmyLua扩展。我们新建一个testLua文件夹,拖入vscode中打开,新建hello.lua文件:

print("hello!")

点击vscode 右上角的 Toggle Panel ,IDE下方切换到终端页签,输入 lua .\hello.lua ,回车,发现可以打印出“hello!”。
在这里插入图片描述
如果报错,找不到lua,网上搜索安装lua for windows 即可。

接下来进行调试前,我们要在lua代码中引入 EmmyLua 的 Debug 代码。 ctrl + p打开搜索输入>EmmyLua,选择Insert Emmy Debugger Code,然后根据宿主程序需要选择 x86/x64即可(我这里选择x86,选完后运行如果有问题就修改插入代码的路径试试另外一个):
在这里插入图片描述

插入后代码如下:

package.cpath = package.cpath .. ";c:/Users/xxxx/.vscode/extensions/tangzx.emmylua-0.8.20-win32-x64/debugger/emmy/windows/x86/?.dll"
local dbg = require("emmy_core")
dbg.tcpListen("localhost", 9966)print("hello!")

可以看到这里有个tcpListen,说明lua代码这边是Server端,IDE进行调试时lua代码的宿主程序需要处于运行状态,一般在游戏开发中没有问题,但是我们的测试代码很快就运行完成并退出了,所以我们这里 使用【Debugger connect IDE】的方式:这里的tcpListen 改成 tcpConnect

我们按照下图步骤生成launch.json文件:
F5
我们需要把这个文件里的ideConnectDebugger值改成false
在这里插入图片描述
接下来就可以调试了,我们在 print("hello!") 前打断点,按F5启动调试器,再在终端页签,输入 lua .\hello.lua 执行即可命中断点:
在这里插入图片描述

EmmyLua 还有许多其他功能,需要注意的是EmmyLua为了支持其他IDE,大部分的配置文件需要配置在项目的工作区顶层目录的.emmyrc.json中,具体的配置说明如下:

{"completion": {"autoRequire": true,"autoRequireFunction": "require","autoRequireNamingConvention": "camelCase","callSnippet": false,"postfix": "@"},"signature": {"detailSignatureHelper": false},"diagnostics": {"disable": [],"globals": [],"globalsRegex": [],"severity": {},"enables": []},"hint": {"paramHint": true,"indexHint": true,"localHint": true,"overrideHint": true},"runtime": {"version": "Lua5.4","requireLikeFunction": [],"frameworkVersions": [],"extensions": [],"requirePattern": []},"workspace": {"ignoreDir": [],"ignoreGlobs": [],"library": [],"workspaceRoots": [],"preloadFileSize": 1048576,"encoding": ""},"resource": {"paths": []},"codeLens": {"enable": true},"strict": {"requirePath": false,"typeCall": true}
}

completion

  • autoRequire: 是否自动补全 require 语句,默认为 true。
  • autoRequireFunction: 自动补全 require 语句时使用的函数名,默认为 require。
  • autoRequireNamingConvention: 自动补全 require 语句时使用的命名规范,默认为 camelCase, 可选值为 camelCase, snakeCase, pascalCase。
  • callSnippet: 是否使用代码片段补全函数调用,默认为 false。
  • postfix: 补全时的后缀,默认为 @。但是设置该选项暂时无用

signature

  • detailSignatureHelper: 是否显示详细的函数签名帮助,默认为 false。

diagnostics

  • disable: 禁用的诊断信息列表, 如果需要工作区内禁用一些诊断消息, 需要填上对应诊断的id, 例如: “undefined-global”
  • globals: 全局变量列表, 在该列表中的全局变量不会被诊断为未定义.
  • globalsRegex: 全局变量正则表达式列表, 符合正则表达式的全局变量不会被诊断为未定义.
  • severity: 诊断消息的严重程度, 例如: “undefined-global”: “warning”, 可选值为 “error”, “warning”, “information”, “hint”.
  • enables: 启用的诊断信息列表, 语言服务的诊断不是全部都启用的, 可以通过该选项启用一些诊断消息. 例如: “undefined-field”

hint

  • paramHint: 是否显示参数提示,默认为 true。
  • indexHint: 在索引表达式跨行时, 是否显示hint,默认为 true。
  • localHint: 是否显示局部变量提示,默认为 true。
  • overrideHint: 是否显示重载提示,默认为 true。

runtime

  • version: 运行时版本, 默认为 Lua5.4, 可选值为 Lua5.1, Lua5.2, Lua5.3, Lua5.4, LuaJIT.
  • requireLikeFunction: 类似 require 的函数列表, 用于识别类似 require 的函数, 例如: [“import”].
  • frameworkVersions: 框架版本列表, 用于识别框架版本, 例如: [“love2d”]. 可以和emmylua doc 的version标签配合使用.
  • extensions: 文件扩展名列表, 用于识别文件扩展名, 例如: [“.lua”, “.lua.txt”].
  • requirePattern: require 模式列表, 该参数和lua中的package.path和package.cpath有关, 例如: [“?.lua”, “?.lua.txt”]. 默认不需要填写, 将自动拥有, [“?.lua”, “?/init.lua”].

workspace

工作区配置, 大部分工作区配置本身既支持相对路径也支持绝对路径

  • ignoreDir: 忽略的目录列表, 用于忽略一些目录, 例如: [“build”, “dist”].
  • ignoreGlobs: 忽略的文件列表, 基于正则表达式的忽略一些文件, 例如: [“.log", ".tmp”].
  • library: 库文件目录列表, 用于指定一些库文件, 例如: [“/usr/local/lib”].
  • workspaceRoots: 工作区根目录列表, 用于指定工作区的根目录, 例如: [“Assets/script/Lua”]. 该功能主要是为了让require正常工作, 如果必须要打开lua主目录的上级目录, 需要在这里添加当前打开的目录相对于lua主目录的相对路径.
  • preloadFileSize: 预加载文件大小, 默认为 1048576 字节, 用于控制预加载文件的大小.
  • encoding: 文件编码, 默认为 utf-8, 用于读取文件时的编码.

resource

  • paths: 资源路径列表, 用于指定需要加载的资源的根目录, 例如: [“Assets/settings”]. 其默认值为当前打开的工作区目录, emmylua支持在任意字符串中的文件路径补全, 以及任意字符串中的文件路径跳转. 通过配置这个目录, 可以让emmylua知道哪些目录是资源目录, 从而正确的提供补全和跳转.

codeLens

  • enable: 是否启用CodeLens功能, 默认为 true.

strict

  • requirePath: 是否启用require严格模式, 默认为 true. 严格模式时, require必须从指定的根目录开始, 否则无法跳转
  • typeCall: 是否启用类型调用时严格模式, 默认为 true. 严格模式时, 类型调用必须手动写好重载, 否则返回unknown, 非严格模式时, 类型调用会返回自身

相关文章:

VSCode 使用 EmmyLua 对lua进行调试

时间:2024年10月 其他:win10,EmmyLua v0.8.20 参考:https://blog.csdn.net/ShenHaoDeHao/article/details/140268354 有几个概念搞清楚就好理解了。一般开发中,我们编写的lua文件由宿主程序的来解析、执行&#xff1…...

neovim ubuntu中WARNING No clipboard tool found

我在vnc远程的ubuntu中做个临时开发,发现neovim无法复制文字,于是我:checkhealth查看了一下,测试结果如下: WARNING No clipboard tool found. Clipboard registers (" and "*) will not work.ADVICE::help clipboard …...

1882B - Sets and Union

题意就是有n个集合,对n个集合做并集得到 S S S, 现在抽n个集合中的集合做交集得到 T T T,问如何做让 S ≠ T S\neq T ST,并且让 T T T尽可能大。 这道题如果数据大一些做不了,但是数字大小只在50之间,并且集合的大小50,n大小50…...

thinkphp阿里云发送短信验证码,存储到缓存中完成手机号验证

源码demo下载地址 https://download.csdn.net/download/hanzhuhuaa/89865893 或者也可以在文章中查看demo源码 ↓ 第一步安装阿里云 SDK 您可以使用 Composer 来安装阿里云的 SDK。在项目目录中运行: composer require alibabacloud/sdk第二步发送短信 namespace app\api\c…...

题目解析:1423. 可获得的最大点数

题目解析:1423. 可获得的最大点数 > Problem: 1423. 可获得的最大点数 题目描述: 你有一个整数数组 cardPoints,表示排成一行的几张卡牌的点数。你每次可以从这排卡牌的 开头或末尾 拿一张卡牌,最终你需要正好拿 k 张卡牌。目…...

【MySQL】数据库的操作

文章目录 一、查看数据库(显示所有的数据库)二、使用数据库二、创建数据库字符集编码(为数据进行编码然后保存)校验(排序)规则(如何对数据进行排序)推荐这样创建数据库: …...

Spring Boot读取resources目录下文件(打成jar可用),并放入Guava缓存

1、文件所在位置&#xff1a; 2、需要Guava依赖&#xff1a; <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version></dependency>3、启动时就读取放入缓存的代码&#xf…...

rsync 数据镜像同步服务笔记

1. rsync概述 定义&#xff1a;rsync是一款数据镜像备份工具&#xff0c;支持快速完全备份和增量备份&#xff0c;支持本地复制与远程同步。镜像指两份完全相同的数据备份.特点&#xff1a; 支持整个目录树和文件系统的更新&#xff1b;可选择性地保留符号链接、文件属性、权限…...

【layui】多文件上传组件实现

插件预览效果&#xff1a; 需要引入layui的脚本文件layui.js和样式文件layui.css html代码&#xff1a; <div class"layui-input-block"><div class"layui-upload-list"><table class"layui-table"><colgroup><col…...

多维最短路

D-最短&#xff1f;路径_牛客小白月赛102 (nowcoder.com) #include <bits/stdc.h> #define int long long using namespace std; const int N1e6; struct node {int x;int y;int z;bool operator>(const node& other) const {return x> other.x;} }; signed m…...

设计模式03-装饰模式(Java)

4.4 装饰模式 1.模式定义 不改变现有对象结构的情况下&#xff0c;动态地给该对象增加一些职责&#xff08;即增加其额外功能&#xff09;的模式。 2.模式结构 抽象构件角色 &#xff1a;定义一个抽象接口以规范准备接收附加责任的对象。客户端可以方便调用装饰类和被装饰类…...

TiDB 监控组件之 Blackbox_exporter 运行原理

作者&#xff1a; TiDBerHailang 原文来源&#xff1a; https://tidb.net/blog/b269e96f 1. 介绍 本文介绍了 TiDB 集群监控组件Blackbox Exporter监控运行机制和配置方式。Blackbox Exporter是Prometheus官方提供的 Exporter&#xff0c;它能够通过多种协议对网络服务进行…...

Java之网络编程详解

一、Java网络编程的基本概念 Java网络编程是指在Java语言中使用网络协议和API进行网络通信的编程技术。Java网络编程可以实现多种应用场景&#xff0c;包括客户端/服务器通信、网站开发、分布式系统等。 二、Java网络编程的基本原理 网络编程的核心概念包括网络通信协议、So…...

苍穹外卖学习笔记(二十)

文章目录 用户端历史订单模块&#xff1a;查询历史订单OrderControllerOrderServiceOrderServiceImpl 查询订单详情OrderControllerOrderServiceOrderServiceImpl 用户端历史订单模块&#xff1a; 查询历史订单 OrderController /*** 历史订单*/GetMapping("/historyOrd…...

2024 第一次周赛

A: 题目大意 骑士每连续 i 天每天会得到 i 个金币&#xff0c;&#xff08;i 1&#xff0c; 2&#xff0c; 3 &#xff0c; …&#xff09;,那么展开看每一天可以得到的金币数&#xff1a;1 2 2 3 3 3 4 4 4 5 5 5 5 5 … 可以发现就是1个1 &#xff0c;2个2, 3个3…,那么我…...

【数据脱敏方案】不使用 AOP + 注解,使用 SpringBoot+YAML 实现

文章目录 引入认识 YAML 格式规范定义脱敏规则格式脱敏逻辑实现读取 YAML 配置文件获取脱敏规则通过键路径获取对应字段规则原始优化后 对数据进行脱敏处理递归生成字段对应的键路径脱敏测试 完整工具类 引入 在项目中遇到一个需求&#xff0c;需要对交易接口返回结果中的指定…...

dbt doc 生成文档命令示例应用

DBT提供了强大的命令行工具&#xff0c;它使数据分析师和工程师能够更有效地转换仓库中的数据。dbt的一个关键特性是能够为数据模型生成文档&#xff0c;这就是dbt docs命令发挥作用的地方。本教程将指导您完成使用dbt生成和提供项目文档的过程。 dbt doc 命令 dbt docs命令有…...

【Windows】【DevOps】Windows Server 2022 安装ansible,基于powershell实现远程自动化运维部署 入门到放弃!

目标服务器安装openssh server参考 【Windows】【DevOps】Windows Server 2022 在线/离线 安装openssh实现ssh远程登陆powershell、scp文件拷贝-CSDN博客 注意&#xff1a;Ansible不支持Windows操作系统部署 根据官方说明&#xff1a; Windows Frequently Asked Questions —…...

深入理解 Parquet 文件格式

深入理解 Parquet 文件格式 深入理解 Parquet 文件格式一、引言二、为什么采用 Parquet 格式1. 行式存储的局限性2. 列式存储的优势 三、Parquet 的工作原理1. 文件结构2. 列块和页面3. 编码和压缩 四、具体数据实例1. 数据示例2. 行式存储 vs 列式存储3. 查询性能对比4. 压缩效…...

计算机挑战赛3

老式的计算机只能按照固定次序进行运算&#xff0c;华安大学就有这样一台老式计算机&#xff0c;计算模式为AB#C&#xff0c;和#为输入的运算符(可能是、-或*&#xff0c;运算符优先级与C一致)&#xff0c;现给出A&#xff0c;B&#xff0c;C的数值以及和#对应的运算符&#xf…...

ES6模块系统终极指南:掌握export *语法的高效用法

ES6模块系统终极指南&#xff1a;掌握export *语法的高效用法 【免费下载链接】es6features Overview of ECMAScript 6 features 项目地址: https://gitcode.com/gh_mirrors/es/es6features JavaScript模块化开发从未如此简单&#xff01;ECMAScript 6&#xff08;ES6&a…...

从一道经典OJ题出发:详解二叉树‘凹入表示法’的输出技巧与C++实现

从一道经典OJ题出发&#xff1a;详解二叉树‘凹入表示法’的输出技巧与C实现 1. 凹入表示法的独特魅力与实现挑战 在算法竞赛和数据结构面试中&#xff0c;二叉树的输出格式往往成为区分选手水平的关键细节。不同于常见的层序遍历或图形化展示&#xff0c;凹入表示法&#xff0…...

Halcon HImage转Bitmap性能大比拼:实测unsafe方案比安全方案快30倍的背后原因

Halcon HImage转Bitmap性能优化实战&#xff1a;从30倍差距到工业级解决方案 在工业视觉检测和实时图像处理领域&#xff0c;毫秒级的性能差异可能意味着生产线能否稳定运行。最近在为一个汽车零部件检测系统做性能优化时&#xff0c;我意外发现Halcon的HImage转Bitmap操作竟成…...

深度学习中的优化器:原理与实践

深度学习中的优化器&#xff1a;原理与实践 一、背景与动机 在深度学习中&#xff0c;优化器是模型训练的核心组件&#xff0c;它决定了模型参数如何根据损失函数的梯度进行更新。选择合适的优化器对于模型的训练速度和最终性能至关重要。本文将深入探讨各种优化器的核心原理、…...

移动端语音交互避坑指南:录音超时截取、倒计时提醒与MP3转换的完整方案

移动端语音交互避坑指南&#xff1a;录音超时截取、倒计时提醒与MP3转换的完整方案 在即时通讯和语音输入场景中&#xff0c;流畅的录音体验直接影响用户留存。数据显示&#xff0c;超过83%的用户会因为录音功能卡顿或操作复杂而放弃使用语音功能。本文将深入解析三个关键体验优…...

MATLAB驱动的焊接机器人智能轨迹优化与动态仿真实践

1. 焊接机器人轨迹优化的技术挑战 焊接机器人在现代制造业中扮演着越来越重要的角色&#xff0c;但要让机器人焊得又快又好&#xff0c;可不是件简单的事。想象一下&#xff0c;你要用焊枪在复杂的三维曲面上画出一条完美的焊缝&#xff0c;既要保证焊接质量&#xff0c;又要避…...

STM32CubeMX实战:5分钟搞定RTC定时唤醒低功耗设计(附LED状态检测技巧)

STM32CubeMX实战&#xff1a;RTC定时唤醒与低功耗设计的5个关键技巧 嵌入式开发者经常面临一个挑战&#xff1a;如何在保证设备功能完整的同时&#xff0c;最大限度地延长电池寿命。RTC&#xff08;实时时钟&#xff09;定时唤醒技术正是解决这一问题的利器&#xff0c;它能让…...

【算法对抗】打穿查重黑盒!论文降AI太难?8个实测有效策略与高性价比工具

上周匆匆写完论文初稿交给导师&#xff0c;结果被一眼识破&#xff0c;当场打回。还被导师认为不认真不负责态度不端正&#xff01; 为了搞定这件事&#xff0c;我测评了市面上大部分的主流工具、试了无数方法&#xff0c;终于把AI率降到6%。 我们要先端正态度&#xff1a;论文…...

【Python AI 工具实战宝典】:20个高复用AI用例+开箱即用代码模板,限时开源库清单泄露!

第一章&#xff1a;Python AI 工具生态全景与实战价值定位Python 已成为人工智能开发的事实标准语言&#xff0c;其核心优势不在于单一库的性能&#xff0c;而在于高度协同、分层清晰的工具生态体系。从底层计算&#xff08;NumPy、CuPy&#xff09;、模型构建&#xff08;PyTo…...

OpenClaw异常处理手册:百川2-13B任务失败排查全攻略

OpenClaw异常处理手册&#xff1a;百川2-13B任务失败排查全攻略 1. 为什么需要这份手册 上周我尝试用OpenClaw百川2-13B模型自动处理日报生成任务时&#xff0c;连续三天凌晨任务失败。每次起床看到控制台的红色错误提示&#xff0c;都要花半小时翻日志找原因。最崩溃的是&am…...