You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua C API中lua_getstack返回0的问题求助(不修改核心逻辑)

问题原因

你调用lua_pcall执行完jj函数后,该函数已经执行完毕并返回,对应的调用栈帧已被Lua虚拟机销毁。lua_getstack只能获取当前活跃的调用栈帧(即函数正在执行时的栈状态),因此此时调用它会返回0,无法获取栈信息。

不修改核心逻辑的解决方案

以下两种方案均保留原代码的核心逻辑(定义Lua函数、调用函数、获取栈信息),仅调整栈信息的获取时机,确保在函数栈帧活跃时执行:

方案1:在Lua函数内部调用C函数获取栈信息

通过注册一个C函数,让Lua函数在执行过程中主动调用该函数,此时栈帧处于活跃状态,可正常获取信息:

  1. 新增用于获取栈信息的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;
}
  1. 在main函数中注册该C函数(放在luaL_openlibs之后):
lua_register(L, "get_stack_info", get_stack_info);
  1. 修改Lua代码,让jj函数内部调用这个C函数:
function jj() 
    print('Hello from Lua!')
    get_stack_info()
end

方案2:使用Lua钩子机制捕获函数调用时机

通过设置Lua的调用钩子,在jj函数被调用时自动触发栈信息获取,无需修改Lua函数的代码:

  1. 定义钩子函数:
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");
        }
    }
}
  1. 在调用lua_pcall之前设置钩子(放在lua_getglobal之后):
// 设置钩子,仅捕获函数调用事件
lua_sethook(L, stack_hook, LUA_MASKCALL, 0);
  1. 可选:在lua_pcall执行完毕后关闭钩子(避免影响后续操作):
lua_sethook(L, NULL, 0, 0);

内容的提问来源于stack exchange,提问作者kos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:33:39