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 脚本而不是可执行文件。

我想答案是非常微不足道的,但我不知道足够的 shell 魔法来自己弄清楚。

需要注意的是,我需要能够使用IRB(输入命令),而不仅仅是运行IRB。

那么在 GDB(或 Valgrind)中运行 IRB 的命令是什么?

4

1 回答 1

1

查看我在这里的 /usr/bin/irb (使用which irb),它只有#!/usr/bin/ruby1.8第一行中的 shebang(即在这种情况下,/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
于 2012-06-16T07:59:27.263 回答