惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Blog of Author Tim Ferriss
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
大猫的无限游戏
大猫的无限游戏
月光博客
月光博客
博客园 - Franky
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿
腾讯CDC
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
P
Privacy International News Feed
The Cloudflare Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Threat Research - Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
Project Zero
Project Zero
S
SegmentFault 最新的问题
美团技术团队
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
云风的 BLOG
云风的 BLOG
Spread Privacy
Spread Privacy
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
B
Blog
Cisco Talos Blog
Cisco Talos Blog
The GitHub Blog
The GitHub Blog
G
Google Developers Blog
T
The Exploit Database - CXSecurity.com
Simon Willison's Weblog
Simon Willison's Weblog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
C
Cisco Blogs
NISL@THU
NISL@THU
J
Java Code Geeks
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
K
Kaspersky official blog
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
I
Intezer
U
Unit 42
博客园 - 聂微东
C
Check Point Blog
Recent Announcements
Recent Announcements
Microsoft Azure Blog
Microsoft Azure Blog
Latest news
Latest news
博客园 - 司徒正美
G
GRAHAM CLULEY
S
Schneier on Security
V
Visual Studio Blog

博客园 - CharyGao

OpenAI Codex AI降智解决方案, 原因解析与系统提示词修改指南 OpenClaw vs Coze/Dify/n8n 帮你半小时内选对合适的AI Skills 热潮过去后,我重新理解了 AI Agent 的方向 智读致用|《埃隆之书》 《一人企业》 一人公司:The Agency 免费“雇佣“144个AI专家,虚拟团队走进现实 用微软Agent Framework打造智能博客生成系统+AI智能体军团 告别加班(第二期):月报还是Word排版?本地AI解您愁 居然可以在 Claude 桌面端用三方模型了! Claude Code 每次启动都要确认权限?一行配置永久解决 98.5% 的人都不知道:SSH 居然还有个“隐藏菜单” 强程序员在 AI 时代的赚钱路径 骚操作来了!Claude编程的42个实战技巧大全 面试官:“简历写着熟练使用 Claude Code,连 simplify 代码审查命令都不知道!”,我:“那又如何呢?” SpringBoot+ResponseBodyEmitter异步流式推送神技 加密后的数据如何进行模糊查询? 最适合新手安装的10个小龙虾🦞 skills来了! 周末和孩子必看的亲子电影合集,陪伴孩子成长的每一步 拒绝代码泄露与“屎山”迷航:GitNexus纯本地知识图谱+可视化关系网,引发GitHub 8800星狂欢 还原BatchEncryption(201610版本)混淆的批处理文件 用上这个Skill,你的Claude Code/Codex 将会比别人快5倍 -- 用分布式思维驯服AI任务编排 前端项目中定义vs code要安装的插件 vscode中claude code插件代理地址设置 2026新手必学:GPT-5.5高效提示词指南 解决 URLEncoder.encode 编码空格变 + 号 Springboot通过谷歌Kaptcha 组件,生成图形验证码 HTTP 与 SpringBoot 参数提交与接收协议方式 SpringBoot多线程池配置 springboot使用logback自定义日志 SpringBoot + Cursor 最佳提示词工程手册 scoop国内安装方法 Prompt 工程实战总结:文本分类、信息抽取、语义匹配 PowerShell DSC(Desired State Configuration)实战指南 OpenClaw多智能体路由实战:飞书多机器人配置指南 OpenClaw 提示词全集 (Prompt Collection) n8n 2.0 中文汉化版一键部署教程 | 解除Execute Command限制 java中Redisson ,jedis,Lettuce和Spring Data Redis的四种深度对比和优缺点详解 Java Web 技术演进:Servlet → Spring → Spring Boot Everything Claude Code(Anthropic 黑客松冠军开源配置) 从 ChatGPT 到 Coding Agent:AI 执行时代的未来猜想 【万字长文】Gemini 3 Pro 全面指南:从免费订阅到 CLI / Agent 实战 Codex 全面实战教程:从安装到工程协作,一篇跑通 3万字硬核拆解 Claude Code:从入门到工程化落地 Gemini 3 完整指南 Codex 完整指南 Claude Code 完整指南4-10 Claude Code 完整指南 claude code 自动保存对话插件 提示词99+ 拜拜Cursor,你好Kiro!(附全平台安装包下载,Win、Mac、Linux) 别再忍了!uv 下载慢如龟速?一招配置国内镜像,让你的 Python 体验坐上火箭! docker配置参数详解---/etc/docker/daemon.json完整参数 win11 清理 OpenCowork 让 AI 在飞书里真正「动手干活」 教你从0到1安装OpenClaw,快速接入飞书,打通任督二脉! SpringBoot 最大连接数及最大并发数是多少??? SpringBoot vs Nginx:5种实现vs1个指令,谁才是防盗链的“真·王者”? Spring Boot日志集成 Redisson 使用手册:从 API 误区到看门狗失效,在此终结分布式锁的噩梦 OpenClaw超级速查表 zeroclaw ubunut25 -ARM 修改国内镜像 openClaw国内镜像安装 知识图谱 —— 结构化知识的强大工具 什么是 Supervised learning(监督学习) 机器学习中的过拟合与欠拟合现象:理论与实践案例研究 解析 Anthropic 的模型上下文协议(MCP)及其优点
OpenResty Lua 代码断点 调试指南:VSCode + LuaPanda
CharyGao · 2026-05-06 · via 博客园 - CharyGao

OpenResty Lua 代码断点 调试指南:VSCode + LuaPanda

OpenResty > Lua断点调试_openresty debug-CSDN博客

在 OpenResty 开发中,调试 Lua 代码一直是个痛点。本文将详细介绍如何使用 VSCode + LuaPanda 实现图形化断点调试。

背景

OpenResty 基于 Nginx  + LuaJIT,与普通 Lua 环境有所不同:

  • 使用 LuaJIT(兼容 Lua 5.1)而非标准 Lua
  • 运行在 Nginx worker 进程中
  • 有自己的 cosocket 实现

因此,配置调试环境需要一些额外步骤。

环境准备

  • macOS(本文基于 macOS,Linux 类似)
  • OpenResty 已安装(/usr/local/openresty
  • VSCode
  • Homebrew

步骤一:安装 VSCode 插件 

在 VSCode 扩展市场搜索并安装 LuaPanda

步骤二:安装 luarocks 和 luasocket

LuaPanda 依赖 luasocket 进行网络通信。关键点:必须为 LuaJIT 编译 luasocket

# 安装 luarocks
brew install luarocks

# 为 LuaJIT 编译安装 luasocket(关键步骤!)
luarocks --lua-dir=/usr/local/openresty/luajit --lua-version=5.1 install luasocket

bash

注意:直接 luarocks install luasocket 会安装 Lua 5.4 版本,与 OpenResty 的 LuaJIT 不兼容,会报错 please install luasocket!

安装完成后,luasocket 位于 ~/.luarocks/ 目录:

~/.luarocks/
├── share/lua/5.1/
│   ├── socket.lua
│   └── socket/
└── lib/lua/5.1/
    ├── socket/core.so
    └── mime/core.so

步骤三:下载 LuaPanda 调试库

mkdir -p ~/LuaProjects/debugger
curl -o ~/LuaProjects/debugger/LuaPanda.lua \
  https://raw.githubusercontent.com/Tencent/LuaPanda/master/Debugger/LuaPanda.lua

bash

步骤四:创建 VSCode 调试配置

项目 根目录创建 .vscode/launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lua",
            "request": "attach",
            "name": "LuaPanda Attach",
            "cwd": "${workspaceFolder}",
            "luaFileExtension": "",
            "connectionPort": 8818,
            "stopOnEntry": false,
            "useCHook": true,
            "autoPathMode": true
        }
    ]
}

json

步骤五:配置 OpenResty

在 nginx.conf 中添加 Lua 路径配置:

http {
    # LuaPanda 调试库路径 + luasocket 路径
    # 注意:~ 在 nginx 中不会展开,必须使用绝对路径
    lua_package_path "/Users/<用户名>/LuaProjects/debugger/?.lua;/Users/<用户名>/.luarocks/share/lua/5.1/?.lua;/Users/<用户名>/.luarocks/share/lua/5.1/?/init.lua;;";
    lua_package_cpath "/Users/<用户名>/.luarocks/lib/lua/5.1/?.so;/Users/<用户名>/.luarocks/lib/lua/5.1/socket/?.so;/Users/<用户名>/.luarocks/lib/lua/5.1/mime/?.so;;";

    server {
        listen 8088;

        location /test {
            content_by_lua_file lua/test.lua;
        }
    }
}

nginx

说明:将 <用户名> 替换为你的 macOS 用户名。路径解释:

  • /Users/<用户名>/LuaProjects/debugger/?.lua - LuaPanda.lua 所在目录
  • /Users/<用户名>/.luarocks/share/lua/5.1/?.lua - luasocket 的 Lua 文件
  • /Users/<用户名>/.luarocks/lib/lua/5.1/?.so - luasocket 的动态库

步骤六:在 Lua 代码中启用调试

在需要调试的 Lua 文件开头添加:

require("LuaPanda").start("127.0.0.1", 8818)

lua

完整示例 /Users/<用户名>/LuaProjects/debugger-test/lua/test.lua

-- 引入 LuaPanda 调试器
require("LuaPanda").start("127.0.0.1", 8818)

-- 测试变量
local name = "OpenResty"
local version = 1.21
local items = {"apple", "banana", "orange"}

-- 测试函数
local function greet(who)
    local message = "Hello, " .. who .. "!"
    return message
end

-- 测试循环
local sum = 0
for i = 1, 10 do
    sum = sum + i
end

-- 调用函数
local result = greet(name)

-- 输出响应
ngx.say(result)
ngx.say("Sum: " .. sum)

lua

步骤七:开始调试

  1. 启动调试器:在 VSCode 中按 F5,选择 “LuaPanda Attach”,等待连接
  2. 设置断点:在代码行号左侧点击设置断点
  3. 启动 OpenResty
    # 进入你的 OpenResty 项目目录(包含 conf/、lua/、logs/ 的目录)
    cd /Users/<用户名>/LuaProjects/debugger-test
    openresty -p `pwd` -c conf/nginx.conf

    bash

    将路径替换为你实际的项目目录

  4. 触发请求
    curl http://localhost:8088/test

    bash

  5. 断点命中:VSCode 会暂停在断点处,可查看变量、调用栈、单步执行

调试功能

中断 点后,可以:

  • 查看变量:在左侧"变量"面板查看局部变量和全局变量
  • 监视表达式:添加自定义表达式监视
  • 调用堆栈:查看函数调用链
  • 单步调试:F10 单步跳过,F11 单步进入
  • 继续执行:F5 继续运行到下一个断点

常见问题

1. 报错 “please install luasocket!”

原因:luasocket 版本与 LuaJIT 不兼容。

解决:使用正确的命令安装:

luarocks --lua-dir=/usr/local/openresty/luajit --lua-version=5.1 install luasocket

bash

2. 断点不命中

检查:

  • VSCode 调试器是否已启动(状态栏显示"等待连接")
  • lua_package_path 和 lua_package_cpath 路径是否正确
  • OpenResty 是否已重启

3. 警告 “writing a global  Lua variable (‘LuaPanda’)”

这是 OpenResty 的全局变量 写入警告,不影响调试功能,可忽略。

生产环境注意事项

  • 调试代码会阻塞 worker 进程,仅在开发环境使用
  • 上线前务必移除 require("LuaPanda").start(...) 代码
  • 可通过环境变量控制是否启用调试:
    if os.getenv("DEBUG") then
        require("LuaPanda").start("127.0.0.1", 8818)
    end

    lua

总结

通过 VSCode + LuaPanda,我们可以在 OpenResty 项目中实现图形化断点调试,大大提升开发效率。关键点是确保 luasocket 使用 LuaJIT 编译,并正确配置 Lua 路径。

参考链接