【问题标题】:Openresty LUA remote debugging in Docker with IDEA使用 IDEA 在 Docker 中进行 Openresty LUA 远程调试
【发布时间】:2019-11-19 10:13:44
【问题描述】:

我在 docker 容器中有 openresty 应用程序:

FROM openresty/openresty:xenial

RUN luarocks install luasocket

# Add additional binaries into PATH for convenience
ENV PATH=$PATH:/usr/local/openresty/luajit/bin:/usr/local/openresty/nginx/sbin:/usr/local/openresty/bin
ENV LUA_PATH="/usr/local/openresty/site/lualib/?.ljbc;/usr/local/openresty/site/lualib/?/init.ljbc;/usr/local/openresty/lualib/?.ljbc;/usr/local/openresty/lualib/?/init.ljbc;/usr/local/openresty/site/lualib/?.lua;/usr/local/openresty/site/?.lua;/usr/local/openresty/site/lualib/?/init.lua;/usr/local/openresty/site/?/init.lua;/usr/local/openresty/lualib/?.lua;/usr/local/openresty/lualib/?/init.lua;./?.lua;/usr/local/openresty/luajit/share/luajit-2.1.0-beta3/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/openresty/luajit/share/lua/5.1/?.lua;/usr/local/openresty/luajit/share/lua/5.1/?/init.lua"
ENV LUA_CPATH="/usr/local/openresty/site/lualib/?.so;/usr/local/openresty/lualib/?.so;./?.so;/usr/local/lib/lua/5.1/?.so;/usr/local/openresty/luajit/lib/lua/5.1/?.so;/usr/local/lib/lua/5.1/loadall.so;/usr/local/openresty/luajit/lib/lua/5.1/?.so"
CMD ["/usr/local/openresty/bin/openresty", "-g", "daemon off;"]

这里是 nginx.conf 示例:

server {
    listen       80;
    server_name  localhost;

    # disable code cache, do not need reload nginx with all changes
    lua_code_cache off;

    location / {
        rewrite_by_lua_block {
            local Core = require "core"
            Core.rewrite()
        }
    }
}

核心lua文件源(每行都有断点):

_G.debug = require("debug")

local Core = {}

function Core:rewrite()
    require("mobdebug").start("host.docker.internal")
    local a = 2
    ngx.say(a)
end

return Core

所以,我尝试使用 EmmyLua (IDEA) + mobdebug 远程调试我的 openresty 应用。

IDEA directories config

调试开始+http调用后:

Start mobdebug server at port:8172
Waiting for process connection...
Connected.

之后什么都没有发生。 我可以看到来自 openresty 的响应,但调试仍处于活动状态,并显示消息“已连接”。

我做错了什么?

【问题讨论】:

  • init_by_lua_* 系列指令初始化 nginx 实例;这是一个与最终处理请求的工作进程不同的线程。如果我没记错的话,您需要在 init_worker_by_lua_* 指令之一中使用一些东西,否则将找不到它们。
  • 没关系,我只是检查了一下,没关系。但是,我发现禁用 Lua 代码缓存会导致在 init_by_lua 中声明的变量被“遗忘”。总之,我想我的建议是:总是在你需要它们的地方需要它们。在生产中,它们可能会被缓存,在开发中它们可能每次都需要;无论哪种方式,这都是一个实现细节。
  • @DarkWiiPlayer,本地要求没有帮助。我已经用示例更新了我的问题。

标签: docker intellij-idea lua remote-debugging openresty


【解决方案1】:

has_breakpoint_file 总是记录 time.lua...

我认为您的设置没有任何问题。只要执行通过该特定行并触发调试挂钩,您应该会看到对 has_breakpoint 的调用(除非您手动“单步执行”代码)。

如果这没有发生,那么您可能需要检查设置断点的代码是否在协程中执行,因为应该显式启用协程调试。详情请见this documentation section

如果这仍然没有帮助,您可能需要在 mobdebug 中将一些 print 命令添加到 debug_hook 函数,以查看它是否在带有断点的行上触发以及之后会发生什么。

【讨论】:

    【解决方案2】:

    如何使用暴露的端口运行 docker 映像?您是否收到“绑定 0.0.0.0:8172 失败:端口已分配”?

    谢谢你, 伊琳娜

    【讨论】:

      猜你喜欢
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2021-12-14
      • 2021-06-21
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      相关资源
      最近更新 更多