LoginSignup
8
6

More than 5 years have passed since last update.

mruby の Fiber の backtrace にFiber.resume の呼び出し元のバックトレースが含まれるようにする mrbgems

Last updated at Posted at 2015-12-01

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 がどこから呼びだされているかわかりやすい。

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6