読者です 読者をやめる 読者になる 読者になる

mruby-backtraceというmrbgemを作った

mruby

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>
--------------------------------