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

提议:添加中断指令

Open fesily opened this issue 1 year ago • 4 comments

必要性

大项目中,当前的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无需修改源码

虚拟机可行性验证

  • [x] lua 5.1
  • [x] lua 5.2
  • [x] lua 5.3
  • [x] lua 5.4
  • [x] luajit

luajit问题

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

提案/实现

  1. lua-halt-5.3.4
  2. lua-halt-5.1.4.patch

fesily avatar Jul 29 '22 05:07 fesily

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

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

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

actboy168 avatar Jul 29 '22 06:07 actboy168

关闭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

fesily avatar Jul 30 '22 06:07 fesily

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

actboy168 avatar Aug 01 '22 03:08 actboy168

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

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

fesily avatar Aug 01 '22 05:08 fesily