Lua C API中lua_getstack返回0的问题求助(不修改核心逻辑)
问题原因
你调用lua_pcall执行完jj函数后,该函数已经执行完毕并返回,对应的调用栈帧已被Lua虚拟机销毁。lua_getstack只能获取当前活跃的调用栈帧(即函数正在执行时的栈状态),因此此时调用它会返回0,无法获取栈信息。
不修改核心逻辑的解决方案
以下两种方案均保留原代码的核心逻辑(定义Lua函数、调用函数、获取栈信息),仅调整栈信息的获取时机,确保在函数栈帧活跃时执行:
方案1:在Lua函数内部调用C函数获取栈信息
通过注册一个C函数,让Lua函数在执行过程中主动调用该函数,此时栈帧处于活跃状态,可正常获取信息:
- 新增用于获取栈信息的C函数:
static int get_stack_info(lua_State *L) { lua_Debug ar; int gg = lua_getstack(L, 0, &ar); if (gg == 0) { fprintf(stderr, "No stack information available\n"); } else { lua_getinfo(L, "nSl", &ar); // 传入"nSl"参数获取函数名、源码、行号 printf("Stack level: 0\n"); printf(" Function: %s\n", ar.name ? ar.name : "(no name)"); printf(" Source: %s\n", ar.short_src); printf(" Line: %d\n", ar.currentline); } return 0; }
- 在main函数中注册该C函数(放在
luaL_openlibs之后):
lua_register(L, "get_stack_info", get_stack_info);
- 修改Lua代码,让
jj函数内部调用这个C函数:
function jj() print('Hello from Lua!') get_stack_info() end
方案2:使用Lua钩子机制捕获函数调用时机
通过设置Lua的调用钩子,在jj函数被调用时自动触发栈信息获取,无需修改Lua函数的代码:
- 定义钩子函数:
static void stack_hook(lua_State *L, lua_Debug *ar) { // 仅在函数调用事件触发时处理 if (ar->event == LUA_HOOKCALL) { lua_Debug ar_info; if (lua_getstack(L, 0, &ar_info)) { lua_getinfo(L, "nSl", &ar_info); printf("Stack level: 0\n"); printf(" Function: %s\n", ar_info.name ? ar_info.name : "(no name)"); printf(" Source: %s\n", ar_info.short_src); printf(" Line: %d\n", ar_info.currentline); } else { fprintf(stderr, "No stack information available\n"); } } }
- 在调用
lua_pcall之前设置钩子(放在lua_getglobal之后):
// 设置钩子,仅捕获函数调用事件 lua_sethook(L, stack_hook, LUA_MASKCALL, 0);
- 可选:在
lua_pcall执行完毕后关闭钩子(避免影响后续操作):
lua_sethook(L, NULL, 0, 0);
内容的提问来源于stack exchange,提问作者kos
相关产品推荐
相关产品推荐

