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