最近遇到 lua 死循环的情况,就研究下如何找到死循环所在的代码,方便定位和解决问题。
首先,要找到出问题的协程(lua_State)。lua vm 实现时,每个协程都有自己独立的堆栈(stack),以及函数栈(CallInfo)。
所以,要先找到死循环的协程,再从这个协程函数栈找到代码。
怎么找到这个协程?
有三种办法:
方法1、 在死循环会执行到的 opcode ,加代码取得当前协程;
方法2、 遍历所有 gc 数据对象,找到当前正在执行的协程;
方法3、 重写 coroutine.resume 及 wrap 函数,取得当前协程。
继续阅读找到 lua 死循环代码