Ruby 如何在irb流程上运行gdb或valgrind?
我正在编写一个Ruby C扩展,经常需要运行GDB或Valgrind来查找bug。为了调试我的规范,我使用以下方法: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
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