如果我理解正确,默认情况下Lua会在发生错误时调用调试库"debug.traceback".
但是,当将Lua嵌入到C代码中时,就像这里的示例中所做的那样: 简单的Lua API示例
我们只在堆栈顶部提供错误消息.
即
if (status) {
/* If something went wrong, error message is at the top of */
/* the stack */
fprintf(stderr, "Couldn't load file: %s\n", lua_tostring(L, -1));
/* I want to print a stacktrace here. How do I do that? */
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
初始错误后如何从C打印堆栈跟踪?
luaL_loadfile(mState, path.c_str());
lua_pcall(mState, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)
有没有办法为那两个加载然后执行lua文件的C++语句设置执行时间限制(例如10-20秒)?
由于Lua文件不受信任,我不希望恶意用户在Lua代码中无限循环地无限期挂起程序.
标记C因为Lua API是C,标记C++因为我使用的是C++
我想创建一个像这样的表
myTable = {
[0] = { ["a"] = 4, ["b"] = 2 },
[1] = { ["a"] = 13, ["b"] = 37 }
}
Run Code Online (Sandbox Code Playgroud)
使用C API?
我目前的做法是
lua_createtable(L, 0, 2);
int c = lua_gettop(L);
lua_pushstring(L, "a");
lua_pushnumber(L, 4);
lua_settable(L, c);
lua_pushstring(L, "b");
lua_pushnumber(L, 2);
lua_settable(L, c);
Run Code Online (Sandbox Code Playgroud)
在循环中创建内部表.之前,这个循环,我用
lua_createtable(L, 2, 0);
int outertable = lua_gettop(L);
Run Code Online (Sandbox Code Playgroud)
为2个数字槽创建外部表.
但是如何将内部表保存到外部表?
有很多关于如何在Lua中克隆Lua表的示例,但是我无法找到如何使用本机Lua C API执行此操作的任何示例.我试图用手做两次,但结果却是一个真正的(虽然有效)混乱.
有没有人有关于如何在C API中优雅地执行Lua表的浅表副本的任何提示或链接?
是否有可能从C/C++中获取lua堆栈中的所有错误?这是我尝试过的
C++
int main()
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
if (luaL_loadfile(L, "LuaBridgeScript.lua"))
{
throw std::runtime_error("Unable to find lua file");
}
int error = lua_pcall(L, 0, 0, 0);
while (error && lua_gettop(L))
{
std::cout << "stack = " << lua_gettop(L) << "\n";
std::cout << "error = " << error << "\n";
std::cout << "message = " << lua_tostring(L, -1) << "\n";
lua_pop(L, 1);
error = lua_pcall(L, 0, 0, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
LUA:
printMessage("hi")
printMessage2("hi2")
Run Code Online (Sandbox Code Playgroud)
输出:
stack = 1
error = …Run Code Online (Sandbox Code Playgroud) 我想通过调用lua_setfenv()在自己的环境中执行不受信任的.lua文件,这样它就不会影响我的任何代码.
该功能的文档虽然只解释了如何调用函数,而不是如何执行文件.
目前运行我使用的文件:
int error = luaL_loadfile(mState, path.c_str()) || lua_pcall(mState, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)
我是否必须使用C API调用"dofile"lua函数lua_setfenv,或者是否有更优雅的方法来执行此操作?
使用最近的luaJIT lua_open返回null.常规的lua库不会发生这种情况.
lua_State *L = lua_open();
std::cout << L << std::endl;
Run Code Online (Sandbox Code Playgroud)
输出: 0x0
我怎样才能让luaJIT工作?
SSCCE:
#include <iostream>
#include <luajit-2.0/lua.hpp>
//linked library: libluajit-5.1.a
int main(int argc, const char * argv[])
{
lua_State *L = luaL_newstate(); // lua_open();
std::cout << L << std::endl; // 0x0
}
Run Code Online (Sandbox Code Playgroud)
其他信息:从源内置在OSX 10.9(尝试都2.0.2和从GIT)与make和make install.使用编译器:
$ cc --version
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.0.0
Thread model: posix
Run Code Online (Sandbox Code Playgroud)
(使用luajit命令行应用程序luajit工作正常,测试脚本可以正常执行.)
我正在尝试将Lua表传递给我的C程序,但我不知道该怎么做.
我的Lua代码:
local stages = {}
stages[1] = stage1
stages[2] = stage2
stages[3] = stage3
lstage.buildpollingtable(stages)
Run Code Online (Sandbox Code Playgroud)
我的C代码:
static int lstage_build_polling_table (lua_State * L) {
luaL_checktype(L, 1, LUA_TTABLE);
lua_getfield(L, 1, "stage1");
lua_getfield(L, 1, "stage2");
lua_getfield(L, 1, "stage3");
stage_t s1 = lstage_tostage(L, -3);
stage_t s2 = lstage_tostage(L, -2);
stage_t s3 = lstage_tostage(L, -1);
printf("%d\n",s1->priority);
printf("%d\n",s2->priority);
printf("%d\n",s3->priority);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我需要做什么来运行所有元素?此代码生成如下错误:
错误的参数#-3到'buildpollingtable'(lstage-Stage*预期,得到表)
谁能解释我做错了什么?
在Lua 5.3中,C API中的表相关函数接收和返回lua_Integer.
void lua_rawgeti (lua_State *L, int idx, lua_Integer n);
void lua_rawseti (lua_State *L, int idx, lua_Integer n);
lua_Integer luaL_len (lua_State *L, int index);
Run Code Online (Sandbox Code Playgroud)
但是,lua_createtable仍然收到int.
void lua_createtable (lua_State *L, int narr, int nrec);
Run Code Online (Sandbox Code Playgroud)
在下面的示例函数中,源表的长度用于创建大小相同的副本.
static int copy_sequence(lua_State *L) {
lua_Integer len, i;
luaL_checktype(L, 1, LUA_TTABLE);
len = luaL_len(L, 1);
lua_createtable(L, (int)len, 0); /* conversion warning */
for (i = 1; i <= len; i++) {
lua_rawgeti(L, 1, i);
lua_rawseti(L, -2, i);
}
return …Run Code Online (Sandbox Code Playgroud) 我的 C 程序可能有一个愚蠢的错误。在某个点上,Lua 堆栈不包含我认为应该包含的值。
为了调试它,我想在程序的某个点打印Lua堆栈的内容。我怎样才能做到这一点而不弄乱进程中的堆栈?