2012-04-05 11 views
2

私はRuby Cエクステンションを書いていますが、バグを見つけるためにGDBやValgrindを頻繁に実行する必要があります。 IRBはRubyスクリプトではなく、実行可能であることから、IRBのために動作しないことに、残念ながらirbプロセスでgdbまたはvalgrindを実行するにはどうすればよいですか?

namespace :spec do 
    RSPEC_CMD = [ 'ruby', '-S', 'rspec', '-Ilib:ext', SPECDIR ] 

    desc "Run specs under GDB." 
    task :gdb => [ :compile ] do |task| 
      cmd = [ 'gdb' ] + GDB_OPTIONS 
      cmd += [ '--args' ] 
      cmd += RSPEC_CMD 
      run(*cmd) 
    end 

    desc "Run specs under Valgrind." 
    task :valgrind => [ :compile ] do |task| 
      cmd = [ 'valgrind' ] + VALGRIND_OPTIONS 
      cmd += RSPEC_CMD 
      run(*cmd) 
    end 
end 

:私のスペックをデバッグするために、私はこれを使用しています。

私は答えが非常に些細なものだと思っていますが、私は自分自身でそれを理解するのに十分なシェルマジックを知らない。

の注意点は、私だけではなく、実行 IRB 使用 IRB(コマンドを入力してください)、のことができるようにする必要があるということです。

GDB(またはValgrind)内でIRBを実行するコマンドは何ですか?

答えて

1

私はここに(which irbを使用して)/ usr/bin/irbを見ると、ちょうど最初の行にシバン#!/usr/bin/ruby1.8を持っています(この場合、/usr/bin/ruby1.8は実際の実行可能ファイルですファイル実行)。私は、また

(gdb) run /usr/bin/irb 
Starting program: /usr/bin/ruby1.8 /usr/bin/irb 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". 
irb(main):001:0> print "Hello world\n" 
Hello world 
=> nil 
irb(main):002:0> 

$ gdb -- /usr/bin/ruby1.8 

をそして、あなたはこのように、あなたにirbのプロンプトを与え、Ruby用の引数としては/ usr/binに/ IRBを指定することができます。だから、GDBにそれを与えるだろうこのワンライナーが私のために働くことを見つける:

$ gdb -ex run --args /usr/bin/ruby1.8 /usr/bin/irb 
関連する問題