我通过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错误消息一样。
答案 0 :(得分:1)
基于此method for getting debug info from the 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
宏替换了一个获取并打印一些调试信息的宏。{/ p>
我使用最新的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]: ?
我似乎已经有了更多的调试信息(即完整的堆栈跟踪)。