发生 SWIG_RuntimeError 的行号。

我正在通过swig运行带有C++库的Lua。当发生swig运行时错误时,我想知道引起问题的行。我收到的错误消息没有此信息。

如何找到触发错误的Lua代码的行?

例如,假设我有一个swig函数“swigstringcount”,它接受一个字符串:

local n=4
local m=swigstringcount(n)
print (m,n)

这个(显然错误的)代码在第二行产生错误。目前我所有得到的信息是:

error:SWIG_RuntimeError: swigstringcount requires a string

我希望它告诉我第2行产生了错误,就像普通的Lua错误消息一样。

点赞
用户168175
用户168175

基于这个 获取 Lua C API 调试信息的方法,我编写了一个 (有点乱) 的示例来展示如何将其集成到 SWIG 接口中:

%module test

%{
#undef SWIG_fail_arg
#define SWIG_fail_arg(func_name,argnum,type) \
  {lua_Debug ar;\
  lua_getstack(L, 1, &ar);\
  lua_getinfo(L, "nSl", &ar);\
  lua_pushfstring(L,"Error (%s:%d) in %s (arg %d), expected '%s' got '%s'",\
  ar.source,ar.currentline,func_name,argnum,type,SWIG_Lua_typename(L,argnum));\
  goto fail;}
%}

%include <std_string.i>

%inline %{
void func(const std::string& str) {}
%}

这基本上将默认的 SWIG_fail_arg 宏替换为一个修改后的宏,它获取并打印一些调试信息。

我使用最新的 SWIG 版本测试过 (我认为你可能正在使用旧版本,因为我看到的文本不太匹配),但我能够做到:

Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require('test')
> local n=4
> test.func(n)
Error (=stdin:1) in func (arg 1), expected 'std::string const &' got 'nil'
stack traceback:
        [C]: in function 'func'
        stdin:1: in main chunk
        [C]: ?

不过,我似乎已经有了更多的调试信息(比如完整的堆栈跟踪)。

2013-02-03 19:11:50