unity-luaFramewrok中lua错误信息的捕获

现有的lua报错有显示 方法调用堆栈,类似 debug.traceback,可能我们有其他需求,要求对错误日志进行收集,然后上传到自己的日志平台,如 sentry
这就要求我们自定义一个错误处理的函数嵌入到lua的调用中


1. 在 Main.lua 中加入错误处理函数 _G__TRACKBACK_

1
2
3
4
5
6
7
8
9
function __G__TRACKBACK__(errorMessage)
local msg = "----- Lua error begin -----\n"
msg = msg.."Lua error: " .. tostring(errorMessage) .. "\n"
msg = msg..debug.traceback("", 2)
msg = msg.."----- Lua error end -----"
Debugger.LogError(msg)

-- errorHandle(errorMessage, msg) -- 日志处理,上传给sentry
end

2. 修改LuaState.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public void PCall(int args, int oldTop)
{
int funcIndex = -(args + 1); //其实funcIndex就等价于oldTop反向索引
if (!LuaDLL.lua_isfunction(L, funcIndex))
{
//如果堆栈中funcIndex不是待调用的 函数,则返回
return;
}
int traceback = 0;

//自定义的错误追踪函数在Main.lua中, __G__TRACKBACK__
LuaDLL.lua_getglobal(L, "__G__TRACKBACK__");
if (!LuaDLL.lua_isfunction(L, -1))
{
LuaDLL.lua_pop(L, 1);
}
else
{
traceback = funcIndex - 1;
LuaDLL.lua_insert(L, traceback); //压入错误处理函数 __G__TRACKBACK__
}

if (LuaDLL.lua_pcall(L, args, LuaDLL.LUA_MULTRET, traceback) != 0)
{
if (traceback != 0)
{
// 移除错误处理函数 __G__TRACKBACK__ 和 error message,其实不处理也行,反正最后 EndPCall 都会恢复栈顶
LuaDLL.lua_pop(L, 2);
}
else
{
string error = LuaDLL.lua_tostring(L, -1);
Exception last = LuaException.luaStack;
LuaException.luaStack = null;
throw new LuaException(error, last);
}
}
}

public void EndPCall(int oldTop)
{
LuaDLL.lua_settop(L, oldTop - 1);
}

3. 故意报错测试一下

这里写图片描述