lua_pcall错误信息丢失
2016-3-16 15:35:13
收藏:0
阅读:86
评论:1
我正在使用lua_pcall调用一些函数,并希望捕获错误。
在某些情况下,错误似乎丢失了。为什么会发生这种情况呢?
这适用于使用错误处理程序和不使用错误处理程序的两种情况。在两种情况下,堆栈的顶部都不是字符串。
C 代码:
lua_getglobal(L, "debug");
lua_getfield(L, -1, "traceback");
lua_replace(L, -2);
lua_rawgeti(L, LUA_REGISTRYINDEX, my_func_index);
// 现在在堆栈上推入 n_in 个值
luaT_stackdump(L);
int pcall_ret = lua_pcall(L, n_in, n_out, -n_in - 2);
// lua_pcall 将从堆栈中消耗 n_in+1 个值。
if(pcall_ret != 0) {
const char* errmsg = lua_tostring(L, -1);
if(!errmsg) {
errmsg = "(没有 Lua 错误消息。)";
printf("意外的 Lua 堆栈:\n");
luaT_stackdump(L);
}
printf("Lua 错误代码 %i: %s\n", pcall_ret, errmsg);
lua_pop(L, 2); // 从堆栈中删除错误和 debug.traceback
return ...;
}
// 现在在堆栈上有 n_out 个值
被调用的 Lua 函数看起来像这样(用于测试):
function (x, W, b, index)
print "来自 Lua func 的问候"
A = torch.rand(15, 12)
B = torch.rand(12, 23)
C = torch.dot(A, B)
end
当调用 torch.dot 时,它会出现错误。
但我不太清楚为什么。我没有得到任何有意义的错误信息。
这就是我的问题所在。
输出结果:
1. Lua 对象类型:函数
2. Lua 对象类型:函数
3. userdata 4165a368 [torch.FloatTensor]
4. userdata 4165a390 [torch.FloatTensor]
5. userdata 4165a230 [torch.FloatTensor]
6. userdata 4165a258 [torch.CharTensor]
---------------------------------------------
来自 Lua func 的问候
意外的 Lua 堆栈:
1. Lua 对象类型:函数
2. userdata 40ea1230 [torch.DoubleTensor]
---------------------------------------------
Lua 错误代码 2: (没有 Lua 错误消息。)
或许我的代码是正确的,这里真的应该返回错误字符串吗?所以也许调用 torch.dot 时存在一些内存损坏,即某些东西被弄乱了?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
似乎需要调用
torch.updateerrorhandlers()。然后我得到了一些有意义的输出:但是只有在Lua函数内部使用
torch.updateerrorhandlers()才有效。我尝试使用以下C代码,但没有效果:
lua_getglobal(L,“torch”); lua_getfield(L,-1,“updateerrorhandlers”); lua_replace(L,-2); assert(lua_pcall(L,0,0,0)== 0);我发现,在实际的
my_func_indexlua_pcall之前再次使用torch.updateerrorhandlers()调用,它就会起作用。 这是意外的,但也许这是因为这可能是另一个线程 (这是我所料料想的)。 实际上,我在Torch代码中发现了torch.updatethreadlocals()函数,它恰好是为此目的而存在的,现在我正在调用另一个lua_pcall之前的这一个:lua_getglobal(L,“torch”); lua_getfield(L,-1,“updatethreadlocals”); lua_replace(L,-2); assert(lua_pcall(L,0,0,0)== 0);现在它有效了。