2016-08-24 4 views
2

私はLuaスクリプトを実行するプログラムでエラー処理を改善しようとしています。 簡略化されたバージョン:[string ""]はどこにでもあり、なぜLuaスタックトレースの関数名が見つからない

stack traceback: 
    [string ""]:7428: in function '__sub' 
    [string ""]:7651: in function <[string ""]:7432> 
    [C]: in function 'xpcall' 
    [string ""]:7658: in function 'main' 
    [string ""]:7928: in main chunk 

は、今私は思ったんだけど:

function _errH(msg) 

    print(msg .. "\n" .. debug.traceback(nil, 1)) 

end 

function _main() 

    -- cause some random error 
    print(a-2) 

end 

function main() 

    xpcall(_main, errH) 
end 

main() 

は私に次のコールスタックを(間違った行番号を無視してください)与えます。

これらの不足しているテキストに影響を与える方法はありますか?関数の定義に加えて関数の名前を付ける必要がありますか? in function '__sub'は表示されますが、in function '_main'は表示されません。

答えて

2

一般に、loadingのときにチャンク名を割り当てることができます。補助機能を使用lua_loadとほとんどがロードされているコンテンツのタイプに基づいてチャンク名を設定します:

  • lua_load
  • luaL_loadfile
  • luaL_dofileluaL_loadfile
  • luaL_loadstringを使用するファイル名を使用するチャンク名を受け入れ文字列の内容を使用します
  • luaL_dostringluaL_loadstring
  • luaL_loadbufferあなたがluaL_loadstringのソースコードを見ると、チャンク名

を受け入れ:

LUALIB_API int luaL_loadstring (lua_State *L, const char *s) { 
    return luaL_loadbuffer(L, s, strlen(s), s); 
} 

お知らせチャンク名などの文字列でluaL_loadbufferを呼び出し、その実際には便利な機能ということ。 "=my_chunk"debug informationに表示されるチャンクの名前である

luaL_loadbuffer(L, s, strlen(s), "=my_chunk"); 

:だから、必要とされるものは、同様に、文字列からコードをロードすることです。

名の前に等号は、バックトレースを変更します。

my_chunk:1: in main chunk 

等号を省略すると、表示される場所:

[string "my_chunk"]:1: in main chunk 
3

その[string ""]は、チャンクをVMにロードする方法に由来します。 lua_dofile/lua_loadfile/lua_dostring/lua_loadstringに引数としてファイル名を指定しなかったか、そこに空文字列を指定しました。
そしてstringは、関数の名前ではなく、luaファイル(luaチャンク)の名前であることに注意してください。

関連する問題