0

swig を介して C++ ライブラリで Lua を実行しています。swig ランタイム エラーが発生した場合、問題の原因となった行を知りたいです。受け取ったエラー メッセージには、この情報がありません。

Lua コードのどの行でエラーが発生したかを調べるにはどうすればよいですか?

たとえば、swig 関数 "swigstringcount" があり、文字列を受け取るとします。

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

この (明らかに間違った) コードは、2 行目でエラーを生成します。現在、私が得るのは

error:SWIG_RuntimeError: swigstringcount requires a string

標準の Lua エラー メッセージのように、2 行目でエラーが発生したことを知らせてほしいのです。

4

1 に答える 1

1

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-03T19:11:50.403 に答える