2

私は Ruby C 拡張機能を作成しており、バグを見つけるために 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 は Ruby スクリプトであり、実行可能ファイルではないためです。

答えは非常に些細なことだと思いますが、自分でそれを理解するのに十分なシェルマジックを知りません.

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

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

4

1 に答える 1

1

私がここに持っている /usr/bin/irb を見ると (を使用してwhich irb)、#!/usr/bin/ruby1.8最初の行にシバンしかありません (つまり、この場合、/usr/bin/ruby1.8 が実際に実行される実行可能ファイルです)。したがって、それを gdb に渡します。

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

Ruby の引数として /usr/bin/irb を指定すると、irb プロンプトが表示されます。

(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 -ex run --args /usr/bin/ruby1.8 /usr/bin/irb
于 2012-06-16T07:59:27.263 に答える