Rubyには、ruby-debugというデバッカが標準ライブラリとしてついている。

これをつかうと、gdbのようなステップ実行ができる。

ruby-debbugの使い方

コンソールから以下のように入力する。

ruby -rdebug [filename]

(rdb:1)というコンソールが現れて、入力待ちになる。操作方法は以下のとおり。

ステップ実行関連のコマンドは以下。ほぼgdbですね。

  b[reak] [file:|class:][line|method]
  b[reak] [class.][line|method]   set breakpoint to some position

  wat[ch] [expression]       set watchpoint to some expression

  b[reak]                    list breakpoints

  del[ete][ nnn]             delete some or all breakpoints

  c[ont]                     run until program ends or hit breakpoint
  s[tep][ nnn]               step (into methods) one line or till line nnn
  n[ext][ nnn]               go over one line or till line nnn
  l[ist][ (-|nn-mm)]         list program, - lists backwards


  q[uit]                     exit from debugger
  r[estart]                  restart program

個人的には、このへんの値参照が役立ちそう。

  v[ar] g[lobal]             show global variables
  v[ar] l[ocal]              show local variables
  v[ar] i[nstance] [object]  show instance variables of object
  v[ar] c[onst] [object]     show constants of object

あとは、watchコマンドとdispコマンドを組み合わせたのがよさそう。

Emacsといっしょにruby-debugをつかう

Emacsようのelispをつかうと、実行中のステップがEmacsから見ることができる。

elispはRubyのソースコードのmiscディレクトリのなかにある。

ダウンロード

rubydb3x.elとrubydb2x.eclが入っているけれど,rubydx2x.elは19.2x以前向けなので,3xを使用する。

rubydb3x.elをロードパスが通った場所において、init.elに以下を追加。

(autoload ‘rubydb “rubydb3x” “run rubydb on program file in buffer” t)

これで、M-x rubydbをおすとデバッガが起動する。

ヘルプコマンドから抜きだし

Commands
  b[reak] [file:|class:][line|method]
  b[reak] [class.][line|method]
                             set breakpoint to some position
  wat[ch] [expression]       set watchpoint to some expression
  cat[ch] ([exception]|off)  set catchpoint to an exception
  b[reak]                    list breakpoints
  cat[ch]                    show catchpoint
  del[ete][ nnn]             delete some or all breakpoints
  disp[lay] [expression]     add expression into display expression list
  undisp[lay][ nnn]          delete one particular or all display expressions
  c[ont]                     run until program ends or hit breakpoint
  s[tep][ nnn]               step (into methods) one line or till line nnn
  n[ext][ nnn]               go over one line or till line nnn
  w[here]                    display frames
  f[rame]                    alias for where
  l[ist][ (-|nn-mm)]         list program, - lists backwards
                             nn-mm lists given lines
  up[ nn]                    move to higher frame
  down[ nn]                  move to lower frame
  fin[ish]                   return to outer frame
  tr[ace] (on|off)           set trace mode of current thread
  tr[ace] (on|off) all       set trace mode of all threads
  q[uit]                     exit from debugger
  v[ar] g[lobal]             show global variables
  v[ar] l[ocal]              show local variables
  v[ar] i[nstance] [object]  show instance variables of object
  v[ar] c[onst] [object]     show constants of object
  m[ethod] i[nstance] [obj]  show methods of object
  m[ethod] [class|module]    show instance methods of class or module
  th[read] l[ist]            list all threads
  th[read] c[ur[rent]]       show current thread
  th[read] [sw[itch]] [nnn]  switch thread context to nnn
  th[read] stop [nnn]        stop thread nnn
  th[read] resume [nnn]      resume thread nnn
  pp expression              evaluate expression and pretty_print its value
  p expression               evaluate expression and print its value
  r[estart]                  restart program
  h[elp]                     print this help