actboy168 / lua-debug

Lua Debug Adapter for Visual Studio Code
MIT License
435 stars 94 forks source link

提议:添加中断指令 #191

Open fesily opened 2 years ago

fesily commented 2 years ago

必要性

大项目中,当前的hook event,会导致大量的cpu浪费,较为明显的减缓整体的运行水平.

使用中断指令会近乎为零的开销.

调试器现实

devCAT.lua-debug区别了中断模式纯lua模式

    if debug.sethalt then
        breaker = createHaltBreaker()
        breakerType = 'halt'
    else
        breaker = createPureBreaker()
        breakerType = 'pure'
    end

路线图

  1. 内置虚拟机添加中断相关接口,兼容hookevent模式
  2. 更进一步,hook lua api无需修改源码

虚拟机可行性验证

luajit问题

无法在jit模式下打中断,除非引用cpu中断指令

提案/实现

  1. lua-halt-5.3.4
  2. lua-halt-5.1.4.patch
actboy168 commented 2 years ago

这种方法需要大量修改lua的代码,这会导致每次上游更新都会有很多维护工作。

其次调试器应该尽可能减少对调试目标的影响,以保证有没有调试器,调试目标的行为都能尽可能保持一致。这种大幅度的patch,我认为很难保持这个目标。

如果你觉得默认模式的调试性能不够,关闭autoupdate即可实现零开销。

fesily commented 2 years ago

关闭autoupdate有一个痛点,如果遇到长时间cpu运行的情况,例如死循环,没法停下来查看循环位置.

还有一个地方,调试器加入之后,时序问题基本不可复现.量子力学,观测了就不能复现.

关于代码维护问题

本质上这个改动是一个第三方库的形式.

1.在Register表里添加一个表,映射中断指令的原始指令是什么 2.在添加三个接口sethalt,clearhalt,gethalts

内部修改

1.指令枚举添加一条新的指令HALT 2.VM解释指令这里加一条HALT指令代码块 3.dumpfunction的时候dump真实的指令集 4.luaG_checkopenop 添加HALT指令

这些都是小改动, 除非后期上游大改整个VM的执行模式,我想这个可能性微乎其微,20年了也没见改.

而且大改也是下一代lua5.5的事情

目前我测试了所有版本,没什么问题.

lua-debug的维护

断点管理直接调用接口:sethalt,clearhalt,gethalts

关于修改虚拟机行为

有修改代码的问题,但是行为我觉得应该是无感知的.

类似于CPU的中断指令,指令重启而已,执行的指令没有任何差别. 无非是在这个被中断的指令的地方调用一次lua_hook回调,lua VM虚拟机hook行为本来就是这样执行的

最后

当然这个是我个人的想法,你有兴趣的话,我可以提pr

actboy168 commented 2 years ago

这个修改还会让没有patch的lua vm无法调试。

fesily commented 2 years ago

没有这个patch的走现在原有的断点模式

    if debug.sethalt then
        breaker = createHaltBreaker()
        breakerType = 'halt'
    else
        breaker = createPureBreaker()
        breakerType = 'pure'
    end