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

wolfmasa's blog

フロンターレとプログラミング関係の話題を、気が向いたときにつぶやくブログです。

Ruby(本体)のビルドとデバッグ

はじめに

Ruby本体にコミットし、あわよくばコミッターになるというのが、私の人生の目標です。

そのためには、C言語で実装されているRubyのビルドやデバッグが最低限必要になります。

とは言え、基礎知識はあるものの、OSS開発に慣れているわけではないので、gccgdb、makeやconfigureなど、覚えるべきことが沢山あります。

というわけで、メモしておきます。

情報収集

開発者メーリングリストruby-devとか眺めていて、気になる挙動があったら、内部をデバッグして追ってみタイト思います。

bugs.ruby-lang.org

あと、issueに関しては、ここに記載があるので、ざっと眺めてみるのも良さそう。

内部実装の基礎知識

Rubyのしくみ -Ruby Under a Microscope-

Rubyのしくみ -Ruby Under a Microscope-

Rubyのランタイムの仕組みを知るには、今はこの本が秀逸だと思う。本当に難しい実装の内容を、すごく絶妙なレベル感で説明してくれる。

クラスの仕組みから、ハッシュの構造や、最後はJRubyなどの解説まで、すごく分かった気にさせてくれる。

Rubyのコミッタになる人だけじゃなくて、Rubyを扱う人全員に基礎知識として是非読んでよ欲しい。それくらわかりやすいし、勉強になる良い本だと思う。

Rubyソースコード完全解説

Rubyソースコード完全解説

昔は、Rubyのランタイムを知るとなれば、まずはこの青木さんの本だったが、今は少し内容が古い。

特に、バージョン1.9で入ったYARVよりも前だったこともあり、内部の設計がかなり現実と乖離してしまっているのが残念。

それでも、基本的なところで変わらないところもあると思うし、最終盤でなければWebで公開されているので、一度読んでみるのは良いこと。

ビルド

techlife.cookpad.com

で、そのRubyの仕組みを勉強して、実際に中身を追ってみたいと思った時には、この記事を参考にして、ビルドとデバッグをしてみるのが良い。

#!/bin/bash

make clean
./configure optflags="-O0" debugflags="-g3"
make
mkdir bin
mv ruby bin/ruby
./bin/ruby -v

内容をざっとスクリプトにしてみると、こんな感じかな。

git clone http://github.com/ruby/ruby
cd ruby

当然ですが、一応補足すると、ソースコード自体はこんな感じで取得できます。

あとは、余裕があれば簡単な動作確認をしてみると良いでしょう。

rubyソースコードGitHubが大元ではないので、厳密な最新版が必要な場合は注意。

make check

これで、ruby単体テストを一通り実行することができます。

が、大体いつもopensslがない!ってエラーで怒られたりします。

 # Running tests:

Finished tests in 2.272786s, 97.2375 tests/s, 200.6348 assertions/s.                                  
221 tests, 456 assertions, 0 failures, 0 errors, 0 skips

ruby -v: ruby 2.5.0dev (2017-02-08 trunk 57577) [x86_64-darwin16]
/Users/myname/go/src/github.com/ruby/ruby/test/rubygems/test_bundled_ca.rb: cannot load such file -- openssl
Skipping `gem cert` tests.  openssl not found.
/Users/myname/go/src/github.com/ruby/ruby/test/rubygems/test_gem_remote_fetcher.rb:84:in `<class:TestGemRemoteFetcher>': uninitialized constant TestGemRemoteFetcher::OpenSSL (NameError)

< exception call stack >

make: *** [yes-test-almost] Error 1

そこでこのあたりを参考にして、opensslを指定してビルドしなきゃいけないことに気づきます(汗 qiita.com

openssl_dir=`brew --prefix openssl`
./configure --with-openssl-dir=$(openssl_dir)
make
make check

デバッグ

デバッグオプション付きでビルドできたら、あとは通常のC言語プログラムと同じようにデバッグできます。

gdb ./ruby -e "print 1"

のようにデバッガで起動して、見たいところにブレークポイントをはって、ステップ実行するとかかな。

詳しくはgdbのヘルプを見れば書いてあるけど、よく使うコマンドとしては

  • b:ブレークポイントをセットする
  • c:処理を継続実行する
  • n:ステップ実行する
  • l:現在のソースコードをを表示する
  • p:変数などを表示する
  • s:ステップインをする(関数の中に入る)

あたりでしょうか。

まとめ

rubyをビルド、デバッグの方法に関する概要を紹介しました。