bdrbの利用マニュアル

インストール手順の英語版が圧縮ファイル内にありますので、 そちらも参照してください。

必要なもの

以下のパッケージをあらかじめインストールしてください。

  • gcc
  • gdb (gdb-6.xでないと動作しないかも)
  • ruby (1.8系列のみ対応。1.9系列では無理)

Windowsの場合、cygwin版rubyとcygwinのgdb,gccならうまく動くかもしれません(未確認)

インストール方法

まず、圧縮ファイルをダウンロードし、解凍まで行ってください。 あとは、よくある以下の手順でインストール終了です。

  $ ./configure
  $ make
  # make install

もし、ruby実行ファイルが環境変数PATH以下に存在しない場合、 configure時に、実行ファイルの場所をフルパスで指定する必要があります。

  $ ./configure RUBYPATH=<ruby's full path>
  $ make
  # make install

使い方

使用手順は以下になります。

  1. gdbを起動し、rubyプロセスのデバッグを開始する
  2. gdb上でsource init.gdb コマンドを実行する(これを行わないと、rdbでstep実行した際、自動的にgdbへ遷移することができません)
  3. rubyプロセスを起動する際、bidebug.rbを最初に読み込む

圧縮ファイル内にある、'tests/hello/test.rb'をデバッグする場合の例を以下に示します。 'test.rb'は、'hello.so'というC拡張ライブラリを使っています。

$ cp init.gdb tests/hello
$ cd tests/hello
$ gdb ruby
(gdb) source init.gdb        # 重要
(gdb) run -rbidebug test.rb  # 重要
(rdb:1) next
(rdb:1) list
   [-2, 7] in test.rb
   1  require 'hello'
   2
=> 3  Hello::hello("foo")
   4  num = Hello::hello("bar")
   5
   6  puts num
(rdb:1) step
   [Switching to Thread 0xb7f646c0 (LWP 4986)]
   Breakpoint 3 at 0xf2467e: file hello.c, line 9.
   wrap_hello (self=3085984300, str=3085983100) at hello.c:9
   9       VALUE wrap_hello(VALUE self, VALUE str){
(gdb) list
   4       int hello(const char* str){
   5         printf("Hello %s\n", str);
   6         return 0;
   7       }
   8
   9       VALUE wrap_hello(VALUE self, VALUE str){
   10        int val = hello(RSTRING(str)->ptr);
   11        return INT2FIX(val);
   12      }
   13
(gdb)

gdb, rdbに追加される機能

本ソフトウェアをインストールすることで、追加される機能を以下に示します。

デバッガ名 機能
gdb switchコマンドを実行するとrdbに遷移する
gdb 動的リンクされたlibruby.soの関数内でbreakpoint等によって停止しそうになったとき自動的に実行を続ける
rdb switchコマンドを実行するとgdbに遷移する
rdb step実行時にC拡張ライブラリの関数を呼んだ場合、gdbに自動遷移する

emacsのgud-modeで使う

emacsのgud-modeでも本ソフトを使うことができます。 emacsの方がソースコードを確認しながらデバッグできるので便利です。

ただし、事前にgdb, rdbがgud-modeで動作するようにしておく必要があります。 apt-getなどでgdb, rubyをインストールした場合は、すでにgud-modeで動作するようになっていると思います

  1. emacsを起動する
  2. emacs上でgud-modeを起動する (M-x gdb で起動できる)
  3. あとは、上の例と同様

動作確認環境

OS Fedora 6
gdb ver 6.7
ruby ver 1.8.5
gcc ver 4.1