Ruby 如何在irb流程上运行gdb或valgrind?

Ruby 如何在irb流程上运行gdb或valgrind?,ruby,bash,gdb,irb,Ruby,Bash,Gdb,Irb,我正在编写一个Ruby C扩展,经常需要运行GDB或Valgrind来查找bug。为了调试我的规范,我使用以下方法: namespace :spec do RSPEC_CMD = [ 'ruby', '-S', 'rspec', '-Ilib:ext', SPECDIR ] desc "Run specs under GDB." task :gdb => [ :compile ] do |task| cmd = [ 'gdb' ] + GDB_OPTI

我正在编写一个Ruby C扩展,经常需要运行GDB或Valgrind来查找bug。为了调试我的规范,我使用以下方法:

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的命令是什么呢?

看看我这里的/usr/bin/IRB(使用
哪个IRB
),它只有shebang
#/第一行中的usr/bin/ruby1.8
(即,在本例中,/usr/bin/ruby1.8是实际运行的可执行文件)。所以你可以把它交给gdb:

$ gdb -- /usr/bin/ruby1.8
然后您可以指定/usr/bin/irb作为Ruby的参数,并给出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