Open fesily opened 2 years ago
这种方法需要大量修改lua的代码,这会导致每次上游更新都会有很多维护工作。
其次调试器应该尽可能减少对调试目标的影响,以保证有没有调试器,调试目标的行为都能尽可能保持一致。这种大幅度的patch,我认为很难保持这个目标。
如果你觉得默认模式的调试性能不够,关闭autoupdate即可实现零开销。
关闭autoupdate有一个痛点,如果遇到长时间cpu运行的情况,例如死循环,没法停下来查看循环位置.
还有一个地方,调试器加入之后,时序问题基本不可复现.量子力学,观测了就不能复现.
本质上这个改动是一个第三方库的形式.
1.在Register表里添加一个表,映射中断指令的原始指令是什么 2.在添加三个接口sethalt,clearhalt,gethalts
1.指令枚举添加一条新的指令HALT 2.VM解释指令这里加一条HALT指令代码块 3.dumpfunction的时候dump真实的指令集 4.luaG_checkopenop 添加HALT指令
这些都是小改动, 除非后期上游大改整个VM的执行模式,我想这个可能性微乎其微,20年了也没见改.
而且大改也是下一代lua5.5的事情
目前我测试了所有版本,没什么问题.
断点管理直接调用接口:sethalt,clearhalt,gethalts
有修改代码的问题,但是行为我觉得应该是无感知的.
类似于CPU的中断指令,指令重启而已,执行的指令没有任何差别. 无非是在这个被中断的指令的地方调用一次lua_hook回调,lua VM虚拟机hook行为本来就是这样执行的
当然这个是我个人的想法,你有兴趣的话,我可以提pr
这个修改还会让没有patch的lua vm无法调试。
没有这个patch的走现在原有的断点模式
if debug.sethalt then
breaker = createHaltBreaker()
breakerType = 'halt'
else
breaker = createPureBreaker()
breakerType = 'pure'
end
必要性
大项目中,当前的hook event,会导致大量的cpu浪费,较为明显的减缓整体的运行水平.
使用
中断
指令会近乎为零的开销.调试器现实
devCAT.lua-debug区别了
中断模式
和纯lua模式
路线图
虚拟机可行性验证
luajit问题
无法在jit模式下打中断,除非引用cpu中断指令
提案/实现