VSCode 使用 EmmyLua 对lua进行调试

news2025/2/22 14:16:59

时间: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, 非严格模式时, 类型调用会返回自身

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2209551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

您是否也在寻找免费的 PDF 编辑器工具?10个备选PDF 编辑器工具

您是否也在寻找免费的 PDF 编辑器工具? 如果是,那么您在互联网上处于最佳位置! 本指南中提到的所有 10 大免费 PDF 编辑器工具都易于使用,可以允许您添加文本、更改图像、添加图形、填写表格、添加签名等等。 因此,…

科技赋能,数字化项目管理发展新方向

项目管理作为推动业务发展的重要手段,正经历着深刻的变革。科技的赋能为数字化项目管理带来了全新的发展机遇,使其朝着更加高效、智能和协同的方向迈进。 一、项目管理发展的现状 当前,项目管理在各个领域得到了广泛应用,但也面临…

后端——eclipse实现前端后端的交互(2)

1.新建前后端文件 新建HTML文件和后端交互Servlet文件。新建文件的地址也有所要求,Servlet文件要在JavaResources下的src中。HTML文件在WebContent下 2. 引入jqury文件 后端与前端的互传需要通过jQuery的ajax,所以要传入jQuery的包到eclipse中,传入位置…

STM32 GPIO输出输入配置:【图文讲解】

1:输出配置 STM32 GPIO输出有四种配置:开漏输出\推挽输出\复用开漏\复用推挽 1:开漏输出: 输出端相当于三极管的集电极。要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强…

沉浸式娱乐新纪元,什么是5G+实时云渲染VR大空间解决方案?

近年来,虚拟现实(VR)技术在娱乐、教育、医疗等多个领域展现出巨大的潜力,尤其是VR大空间体验,更是以其沉浸式和互动性的特点,迅速成为市场的新宠。据Statista数据显示,2023年,全球虚…

UE5影片渲染基本设置记录

以下是UE5过场动画制作中影片渲染其中一种高质量输出的基本设置记录: 控制台变量这里输入: r.ScreenPercentage r.DepthOfFieldQuality

C++:STL:vector类常用函数介绍(附加部分重要函数模拟实现)

cplusplus.com/reference/vector/vector/https://cplusplus.com/reference/vector/vector/ vector在实际中非常的重要,在实际中我们熟悉常见的接口就可以,有了string的基础,vector其实大体使用方法上二者是类似的: 这里我们先给…

MLCC贴片电容不同材质区别:【及电容工作原理】

贴片电容的材质常规有:NPO(COG),X7R,X5R,Y5V 等,主要区别是它们的填充介质不同。在相同的体积下由于填充介质不同所组成的电容器的容量就不同,随之带来的电容器的介质损耗、容量稳定…

垂直领域的大模型应该如何构建?RAG还是微调呢?

垂直领域的大模型应该如何构建?RAG还是微调呢? 垂直领域的大模型应该是2024年乃至未来五年内人工智能发展的热门所在。那么该如何构建?是RAG(Retrieval Augmentation Generation,检索增强生成)还是微调&am…

Springboot 整合 Java DL4J 实现医学影像诊断功能

🧑 博主简介:历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,…

PDF 转 CAD 工具:实现文档格式高效转换的利器

音频创作已经变得越来越普及啦,这就导致我们需要一款音乐软件来进行音频创作。作为刚入门的新手我比较推荐使用免费的音频剪辑软件来开启音乐之门。所以今天我们就一同来探讨有什么好用的音频剪辑工具吧。

【在Linux世界中追寻伟大的One Piece】信号捕捉|阻塞信号

目录 1 -> 信号捕捉初识 2 -> 阻塞信号 2.1 -> 信号其他相关常见概念 2.2 -> 在内核中的表示 2.3 -> sigset_t 2.4 -> 信号集操作函数 2.5 -> sigprocmask 2.6 -> sigpending 3 -> 捕捉信号 3.1 -> 内核如何实现信号的捕捉 3.2 ->…

以JavaScript的学习角度看Axios,并以spring boot+vue3为例具体分析实现

什么是Axios Axios 是一个基于 Promise 的 HTTP 客户端,用于在浏览器和 后端 中发送异步的 HTTP 请求。它功能强大、易用,常用于与 API 交互,发送 GET、POST、PUT、DELETE 等请求。 Axios 的主要特点: 支持 Promise Axios 基于 …

【数据结构笔记】搜索树

二叉搜索树 任一节点x的左/右子树中,所有非空节点均不大于(不小于)x 必须是所有的非空节点,仅左右孩子不够(左孩子的右孩子可能很大)一棵二叉树是二叉搜索树当且仅当中序遍历序列是单调非降序列 两棵二叉…

在电脑上免费压缩视频的 16 个视频压缩软件

正在寻找适用于 Windows 或 Mac 的最佳视频压缩器,让您轻松压缩 MP4、AVI、MKV、MOV 和更多类型的文件?无论您是通过社交媒体与朋友分享视频录制、释放手机空间,还是通过邮件发送长 MP4 视频,都必须使用付费或免费视频压缩软件来压…

2013年国赛高教杯数学建模D题公共自行车服务系统解题全过程文档及程序

2013年国赛高教杯数学建模 D题 公共自行车服务系统 公共自行车作为一种低碳、环保、节能、健康的出行方式,正在全国许多城市迅速推广与普及。在公共自行车服务系统中,自行车租赁的站点位置及各站点自行车锁桩和自行车数量的配置,对系统的运行…

提升邮件营销设计精准度秘诀,效率与效果实践

邮件营销通过确定目标群体、数据分析、邮件设计、测试优化、保持频率时效性及结合其他渠道实现精准营销,提高市场效益。ZohoCampaigns集成CRM、自动化功能和客户细分提升效果。 1、确定目标群体 精准营销的第一步是了解并确定你的目标群体。标定目标群体包括年龄、…

SpringSecirity(四)——用户退出

因为JWT是无状态的,去中心化的,在服务器端无法清除,服务器一旦进行颁发,就只能等待自动过期 才会失效,所以需要redis配合才能完成登录状态的记录。 实现思路: 登录后在redis中添加一个白名单,把…

信息系统运维管理方案,运维建设文档,运维平台建设方案,软件硬件中间件运维方案,信息安全管理(原件word,PPT,excel)

建设方案目录: 1、智慧运维系统建设背景 2、智慧运维系统建设目标 3、智慧运维系统建设内容 4、智慧运维系统建设技术 5、智慧运维系统建设流程 6、智慧运维系统建设收益 企业对运维管理的需求: 1、提高运维效率:降低运维成本,提高…

威纶通触摸屏与三菱FX5u之间 EtherNet/IP无线以太网通信方案

在实际系统中,同一个车间里分布多台PLC,由触摸屏集中控制。通常所有设备距离在几十米到上百米不等。在有通讯需求的时候,如果布线的话,工程量较大且不美观,这种情况下比较适合采用无线通信方式。本方案以威纶通触摸屏和…