Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中,如何打印Lua堆栈的内容?_C_Lua_Lua Api - Fatal编程技术网

在C中,如何打印Lua堆栈的内容?

在C中,如何打印Lua堆栈的内容?,c,lua,lua-api,C,Lua,Lua Api,我的C程序可能有一个愚蠢的错误。有一点,Lua堆栈不包含我认为应该包含的值 为了调试它,我想在程序的某一点打印Lua堆栈的内容。如何在不弄乱堆栈的情况下执行此操作?此代码从上到下遍历堆栈,并对每个值调用tostring,打印结果(如果未获得结果,则打印类型名称) 此答案是@lhf在评论中提供的答案的略加编辑的版本 它的优点是不修改堆栈中的任何值,并且不需要任何额外的空间 静态无效转储堆栈(lua_State*L){ int top=lua_gettop(L); 对于(int i=1;我这样做是为

我的C程序可能有一个愚蠢的错误。有一点,Lua堆栈不包含我认为应该包含的值


为了调试它,我想在程序的某一点打印Lua堆栈的内容。如何在不弄乱堆栈的情况下执行此操作?

此代码从上到下遍历堆栈,并对每个值调用
tostring
,打印结果(如果未获得结果,则打印类型名称)


此答案是@lhf在评论中提供的答案的略加编辑的版本

它的优点是不修改堆栈中的任何值,并且不需要任何额外的空间

静态无效转储堆栈(lua_State*L){
int top=lua_gettop(L);

对于(int i=1;我这样做是为了回答您的问题:?或者这个:?不幸的是,没有。当我的程序崩溃时,我已经有一个堆栈跟踪,并且我已经知道它正在崩溃的是哪一行。我想要的是能够为当前堆栈帧打印存储在堆栈中的Lua值。也就是说,插槽的内容从
1
get_top(L)
我不明白为什么它关闭得太宽(我投了dupe),所以我投票决定重新打开。这不应该因为太宽而关闭。Lua堆栈在Lua的C API中是一个非常特殊的东西。它一点也不不清楚。你已经忘记检查Lua C API堆栈中的可用空间了。不幸的是,这个解决方案没有保留
L->top
的值,因此它对我不起作用。@hugomg它没有?Wh在代码结束时,它应该具有初始值。此代码的固定版本必须确保有足够的空间来推送额外的元素,这可能需要重新分配堆栈。您是对的,大多数情况下这不重要,但这确实意味着如果您试图调试涉及Lua stac的崩溃调用thid print函数可能会更改您试图调试的程序的行为。此代码更改堆栈中的值:它将数字转换为字符串。
assert(lua_checkstack(L, 3));
int top = lua_gettop(L);
int bottom = 1;
lua_getglobal(L, "tostring");
for(int i = top; i >= bottom; i--)
{
    lua_pushvalue(L, -1);
    lua_pushvalue(L, i);
    lua_pcall(L, 1, 1, 0);
    const char *str = lua_tostring(L, -1);
    if (str) {
        printf("%s\n", str);
    }else{
        printf("%s\n", luaL_typename(L, i));
    }
    lua_pop(L, 1);
}
lua_pop(L, 1);