调试库中的所有自省函数都能够接受一个可选的协程作为第一个参数,这样就可以从外部来检查这个协程。例如,考虑如下示例:
co = coroutine.create(function () local x = 10 coroutine.yield() error("some error") end) coroutine.resume(co) print(debug.traceback(co))
对函数 taceback
的调用作用在协程 co
上,结果如下:
stack traceback: [C]: in function 'coroutine.yield' main.lua:3: in function <main.lua:1>
由于协程和主程序运行在不同的栈上,所以回溯没有跟踪到对应函数 resume
的调用。
当协程引发错误时并不会进行栈展开,这就意味着可以在错误发生后检查错误。继续上面的示例,如果再次唤醒协程,它会提示引起了一个错误:
print(coroutine.resume(co)) --> false temp:4: some error
现在,如果输出栈回调,会得到这样的结果:
stack traceback: [C]: in function 'error' temp:4: in function <temp:1>
即使在错误发生后,也可以检查协程中的局部变量:
print(debug.getlocal(co, 1, 1)) --> x 10