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

时间:2012-04-05 18:40:58

标签: ruby bash gdb irb

我正在编写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的命令是什么?

1 个答案:

答案 0 :(得分:1)

查看我在这里的/ usr / bin / irb(使用which 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