使用IDEA在Docker中进行Openresty LUA远程调试

时间:2019-07-09 19:47:14

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

我在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的响应,但是调试仍然有效,并显示消息“已连接”。

我在做什么错了?

3 个答案:

答案 0 :(得分:0)

  

并且has_breakpoint_file总是记录时间。lua ...如果我放几个断点-那么所有这些断点都会记录在set_breakpoint中,但是has_breakpoint函数中没有一个记录。

我看不到您的设置有任何问题。只要执行通过该特定行并且触发了调试钩子,您就应该看到对has_breakpoint的调用(除非您手动“逐步”执行代码)。

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

如果仍然不能解决问题,则可能需要在mobdebug中的print函数中添加一些debug_hook命令,以查看是否在具有断点的那些行上触发了它,以及之后发生了什么。

答案 1 :(得分:0)

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

谢谢你, 伊琳娜(Erina)

答案 2 :(得分:0)

TL; DR:请等待几年(最多)。

长版:该技术还不存在。现有的所有Lua调试器都要求您先修改代码,然后才能对其进行调试,所以1970年代我什至不能。诸如StoppingOnBreakpoints™之类的基本东西显然在不能与工作配置无穷不同的配置中不起作用。这仅仅是Lua程序员在2019年末的生活。

此外,各种Lua调试器解决方案的作者都倾向于用“它应该起作用(耸耸肩)”来答复问题报告。这不是一个好兆头。