mruby の例外の backtrace は Fiber.resume より呼び出し元に近い関数は含まれない。
この動作は CRuby も同じではあるが
時々不便に感じていたので Fiber.resume の呼び出し元のバックトレースが含まれるようにする mrbgems を作ってみた。
sample.rb
begin
  fb = Fiber.new do
    Fiber.yield
    raise "ttt"
  end
  fb.resume
  fb.resume
rescue => e
  puts "e.backtrace"
  puts "#{e.backtrace.map{|v| "  " + v}.join("\n")}"
end
mruby-better-fiber-backtrace を使ってない場合だと以下の様な出力である。
e.backtrace
  ./sample.rb:10
出力が backtrace を読んだ位置になっているので以下の mrbgems を割り当てると
https://github.com/dycoon/mruby-ruby-like-backtrace
(関係する記事はこちら
mruby で例外が起こった場所の backtrace を rescue 節など他の場所でも取得できるようにする)
以下のようになる。
e.backtrace
  /work/small_repos/mruby-ruby-like-backtrace/mrblib/ruby_like_backtrace.rb:19:in Exception.initialize
  sample2.rb:4
raise された位置は出てくるが Fiber.resume より呼び出し元に近い関数は出力されない。
mruby-better-fiber-backtrace を使うと以下のように出力される。
e.backtrace
  /work/small_repos/mruby-better-fiber-backtrace/tmp/mruby/build/mrbgems/mruby-ruby-like-backtrace/mrblib/ruby_like_backtrace.rb:19:in Exception.initialize
  ./sample.rb:4
  /work/small_repos/mruby-better-fiber-backtrace/tmp/mruby/build/mrbgems/mruby-ruby-like-backtrace/mrblib/ruby_like_backtrace.rb:19:in Exception.initialize
  /work/small_repos/mruby-better-fiber-backtrace/mrblib/better_fiber_backtrace.rb:16:in Fiber.resume
  ./sample.rb:7
Fiber.resume がどこから呼びだされているかわかりやすい。