lua-debug icon indicating copy to clipboard operation
lua-debug copied to clipboard

协程内调用 require "debugger":attach{} 会卡住

Open huanzai opened this issue 1 year ago • 3 comments

require "debugger":start "127.0.0.1:12306":event "wait"
print "ok"

function test()
    local count = 0
    for i=1, 1000 do 
        count = count + 1
    end
end

function example()
    require "debugger":attach {}
    print("coroutine started")
    for i=1,5 do 
        test()
        print("do "..i)
        coroutine.yield()
    end
    print("coroutine finished")
end


local co = coroutine.create(example)

coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)

print "down!"

调 require "debugger":attach {} 时,会执行到

static void clear_client(lua_State* hL) {
        luadbg_State* L = get_client(hL);
        lua_pushnil(hL);
        lua_rawsetp(hL, LUA_REGISTRYINDEX, &DEBUG_CLIENT);
        if (L) {
            luadbg_close(L);  // 这里就停掉了。
        }
    }

这里 get_client 能拿到一个 L(luadbg_State*) 是主线程创建的,然后就被 luadbg_close 掉了

huanzai avatar Sep 06 '24 12:09 huanzai

attach 是为什么,同一个实例不需要 attach

actboy168 avatar Sep 06 '24 13:09 actboy168

[#128 ] 我看这里需要:在coroutine中调用require "debugger":attach{},通知调试器这个coroutine需要调试。

huanzai avatar Sep 06 '24 14:09 huanzai

attach.zip 见这个例子,

  1. launch.json 的 stopOnEntry: false ,不加断点启动
  2. 在启动 debugger 后,再对 test1 加断点(test1.lua在协程内被加载)
  3. 此时断点不生效

所以想通过在协程中attach来激活协程的hook

huanzai avatar Sep 06 '24 15:09 huanzai