mrubyのスクリプト内でエラーが起きたときにエラーの起きた行番号が表示されなくて不便だなーと思っていたのだけど、出し方がわかったのでメモ。
文字列を実行するmrb_load_string()
や、ファイルから読み込んで実行するmrb_load_file()
を使うとエラー情報が生成されない。自分でコンテキストを生成して、さらにファイル名を指定してやることでエラー情報やバックトレースが表示される。
|
実行結果:
trace: |
Object.funcなどとなってしまうところが残念だな…。
注意点として、エラーが発生したときには一時オブジェクトをGCから守るためのarenaが変更されたまま戻ってきてしまい、これを続けているとRuntimeError : arena overflow error
が発生するので、C側からスクリプトを呼び出す時には必ずsave
~`restore`してやる必要がある。
そうした場合には、例えば上記のdoXXXX()
関数でスクリプトの実行結果の戻り値を返そうとしても、arenaを戻してしまっているのでその値が有効である保証がなくなるのでそういうことはできない。戻り値を参照するのであればarenaを戻す前にしないといけない。
DISABLE_STDIO
で標準入出力をオフにしている場合は、mrb_get_backtrace()
を呼び出すとバックトレースの情報がmrubyの配列として取得できるので、これを使って自前で出力すればよい:
extern "C" mrb_value mrb_get_backtrace(mrb_state*, mrb_value); |
リリース時にエラー情報がいらない、という場合にはコンテキストにNULL
を渡してやるか、コンテキストなし版の関数を呼び出してやればよい。