HostVM

说明

其实就是预定义的内部探测点,遇到探测点时相当于把执行权限让给 Debug VM,后者观察当前的环境参数改变自己的行为。

使用方式是通过 mare/hostvm/ 下的模块来使用,例如:

local console = require('mare/hostvm/console')
local debugger = require('mare/hostvm/debugger')

如果你打开代码看,基本上都是类似于下面的函数:

function console.log(...)
rdebug.probe('$console.log', ...)
end

Mare 使用的探测点名使用了 $ 前缀,表示作为内部使用,并作一些特殊处理,所以你使用的探测点名最好不要以 $ 开头。

Console 模块

提供类似 JavaScirpt 的 Console API 功能,给打印输出更多语义,即日志等级,调用堆栈,相当于加强版的 print,DevTools 里可以按日志等级过滤,以及和源码交互,跟 print 不同的时不会输出到标准输出。

可以参考 test-example/test-console.lua 里的示例。

console.log

打印 log 级别的日志,JavaScript 里最常用的打印命令,其实 print 的默认行为就定义成这个函数。

console.debug

打印 debug 级别的日志,DevTools 会显示成蓝色。

console.info

打印 info 级别的日志,DevTools 会在前面加上叹号图标。

console.warn

打印 warn 级别的日志,DevTools 会在黄色背景显示,并且显示调用栈,源码里也会加上相应的高亮。

console.error

打印 error 级别的日志,DevTools 会在红色背景显示,并且显示调用栈,源码里也会加上相应的高亮。

console.trace

打印 log 级别的日志,跟 console.log 只是多了显示调用栈。

console.group

开始一个输出分组,后续的输出将都是这个分组的内容,默认分组内容是展开的。

console.group_collapsed

类似 console.group,只是默认是折叠起来的。

console.group_end

结束最近的分组。

console.clear

强行对 DevTools 进行清屏。

所有接口实际上都是一个日志等级名的不同,发送给 server 的数据量并没有多大差别,也就是 console.log 输出其实也是包含调用栈的,只是 DevTools 默认不显示而已。

分组是可以多层嵌套的,所以开启和结束数量务必对齐。

Debugger 模块

提供用来控制调试器行为的接口

debugger.pause

但调用这个函数时,自动中断。也就是某些情况在 DevTools 里不好下断点,可以用这个函数在 Host 里强行中断。

中断是在这个函数的 return 事件。

debugger.start

让调试器连接 mare-server,如果已经连接了,则没有效果。

debugger.stop

让调试器断开和 mare-server 连接,如果已经断开了,则没有效果。

debugger.restart

让调试器重新连接 mare-server,强制执行,相当于 stop 然后 start。

debugger.keepalive

对服务器发送一个心跳包,以便保持连接。

debugger.setopt

传递一些配置数据,比如改变 print 的日志等级

debugger.repl

非中断情况下,执行 DevTools Console 发送过来的代码。

debugger.idling

没有特殊目的,就单纯让点 CPU 给 Debug VM。