mruby-backtraceというmrbgemを作った
mruby用にbacktraceを吐くためのクラスとメソッドを追加してくれるmrbgemを作りました。
https://github.com/crimsonwoods/mruby-backtrace
このgemを有効にした状態でmrubyをビルドすると、
Backtraceというクラスと、「put_vm」、「put_rb」というクラスメソッドを使用できるようになります。
適当なところで、
Backtrace.put_rb
とかしてみると、Rubyのコールスタックが標準出力に吐き出されると思います。
ちなみに「put_vm」の方は、
VMの中のC言語で実装されている部分のコールスタックを吐き出してくれます。
libunwindを使ってちょー適当に実装しているので、問題があったらpull-requestとか送ってもらえるとありがたいです。
こんなコードを書いてbacktraceを吐かせると、
def factorial(n) if (n != 0) && ((n % 4) == 0) then Backtrace.put_rb end if n == 0 then 1 else n * factorial(n-1) end end factorial 10
こんな感じのトレースを出力してくれます。
backtrace: test.rb:3:in Object.factorial test.rb:8:in Object.factorial test.rb:8:in Object.factorial test.rb:12 backtrace: test.rb:3:in Object.factorial test.rb:8:in Object.factorial test.rb:8:in Object.factorial test.rb:8:in Object.factorial test.rb:8:in Object.factorial test.rb:8:in Object.factorial test.rb:8:in Object.factorial test.rb:12
ちなみに「put_vm」するとこんな感じです。
---- [backtrace] --------------- 0x458e73 <mrb_bt_put_vm + 0x4c> 0x41143a <mrb_run + 0x194b> 0x43ea08 <load_exec + 0x469> 0x43eb03 <mrb_load_file_cxt + 0x41> 0x402af9 <main + 0x3bc> 0x7f0e3895876d <__libc_start_main + 0xed> 0x401d39 <_start + 0x29> --------------------------------