生まれて初めてRuby書いた。ChangeLogに僕の名前が載った。うれしい。
- Bug #10706: Segmentation fault when change visibility of refined new method - ruby-trunk - Ruby Issue Tracking System
- Bug #10707: Segmentation fault when get refined new method in BasicObject - ruby-trunk - Ruby Issue Tracking System
- Comparing 759a31b…3f8ceab · ruby/ruby
- ruby-trunk-changes r49173 - r49185 - PB memo
経緯
Refinement周りでSEGVして落ちる現象を見つけた。
お正月で下調べしたところvm_method.c
周りで落ちるコード例を複数みつけたので雑に直してみた。
雑に直した結果、複数のバグを直すコードが1つに混ざってしまった。
正月明けてからはパッチを送るのを目標に、一旦整理しなしていた。
個別にテストを書いてバグを直し、コントリビュートできるように準備。
水曜日のOkinawa.rbの日にRuby Issue Tracking Systemにアカウントを登録し、報告した。
次の日、nobuさんにパッチを取り込んでもらえた :tada:
報告方法、パッチの作り方
具体的な報告方法や、パッチの作り方は、しばたさんのRubyKaigiの話と公式のHowToReportJaを参考にした。具体的なパッチの作り方とか、報告する際に気をつけるポイントが書かれていてとても参考になった。
- HowToReportJa - Ruby - Ruby Issue Tracking System
- ▶ The Twelve-factor Ruby 「Ruby を良くするための12のポイント」 - RubyKaigi 2014 - YouTube
- The Twelve-factor Ruby // Speaker Deck
投げたパッチそのまま取り込まれたわけではなくより適切な場所で直されていた。 どこで直せばいいか悩んでいる場合もとりあえず投げてみるものだと思った。 あとChangeLogの文章も追加してもらえて大変ありがたい。
テストを書いた
Ruby Issue Tracking Systemに報告されたバグは、ruby-coreあるいはruby-devにメールが流れる。 bugsに報告があった場合、以下のような感じでassertのメッセージにruby-coreの番号と、bugsのチケット番号を書くのが慣例のように見えた。
``` ruby bug10707 = ‘[ruby-core:67389] [Bug #10707]’ module RefinementBug refine BasicObject do def foo end end end
assert(methods, bug10707) assert_raise(NameError, bug10707) {method(:foo)} ```
よかったこと
- Rubyへ貢献できた
- 短いコードを実行するだけで必ずSEGVするので問題がわかりやすかった
- 再現できるのでパッチが書きやすい
- SEGVを直すことにフォーカスできた
- RubyがSEGVしたときデバッグする経験がつめたので、次SEGVおきても怖くない
他いろいろ知見あったきがするけどgdbのマクロがruby/rubyに添付されててデバッグ便利そうだからgdbでデバッグしておけばよかった、みたいなしょうもないのもある。
感謝
ちょっとだけRuby直すのチャレンジしてみたけど大変だった。
Rubyのコアコミッターの人たち、こういうバグ報告をうけて毎日直すのなかなかすごい。 報告受けて調べて、パッチあったらパッチ見てレビューして当てて…(自分で直すより大変なのでは)
Ruby開発者の方々への感謝の気持ち深まった。ありがとうございます。
RubyのしくみやRHGのおかげでRubyのしくみちょっと分かるようになった。 この本なかったら貢献出来なかったと思う。 ありがとうございます。