actboy168 / lua-debug

Lua Debug Adapter for Visual Studio Code
MIT License
437 stars 95 forks source link

先创建协程再附加进程,协程内的断点无法触发 #128

Closed sumneko closed 3 years ago

sumneko commented 3 years ago
local dbg = require "debugger"
dbg:start "127.0.0.1:12306"

dbg:event "wait" --@A

local function f()
    print(111) --@B
end
local co = coroutine.create(function ()
    f()
end)

dbg:event "wait" --@C

coroutine.resume(co)

以上测试代码,在 --@B 处断点,如果你在 --@A 处让调试器附加了进程,就可以成功断点。如果将 --@A 移除,使得调试器在 --@C 处附加了进程,就无法断点

actboy168 commented 3 years ago

这个问题是因为lua无法设置全局的hook,lua只会在创建coroutine时从父亲那里复制一次hook。也就是说调试器加载时已经存在的coroutine,将无法被调试器发现。

解决这个问题的办法有三个: 1.在所有的coroutine创建前,加载调试器。 2.在coroutine中调用require "debugger":attach{},通知调试器这个coroutine需要调试。 3.使用launch.dll中的autoattach,不过目前这个没有做封装,因为我觉得得不偿失。

actboy168 commented 3 years ago

仔细想了一下,检测coroutine的hook目前是调试器自己实现的,没有必要遵循lua自己的规则。所以对于threadhook,我改为了只考虑主线程的hookmask,同时设置threadhook也会设置主线程的hookmask。应该能解决这个问题。

sumneko commented 3 years ago

测试了一下问题已经解决

marissagloop commented 4 months ago

skynet的调试也用同样方法搞定