以下是一个简单的示例,展示了我如何在代码中跟踪位置。如果我需要知道模块中的位置:
class Foo
attr_reader :initialize_loc
def initialize
@initialize_loc = [__FILE__, __LINE__]
end
end
如果我需要知道某事发生的地点:
require_relative 't1'
foo = Foo.new
puts 'foo initialized at %s:%s' % foo.initialize_loc
当我运行代码时,我得到以下结果:
FooBar:Desktop foobar ruby t2.rb
foo initilized at /Users/foobar/Desktop/t1.rb:4
如果我不想动模块的源代码,而且希望在需要时调试器可以跳入其中,我只需让调试器做如下操作:
require_relative 't1'
require 'ruby-debug'
debugger
foo = Foo.new
puts 'foo initilized at %s:%s' % foo.initialize_loc
执行将停止,我会跳到
debugger
后面的一行进行调试:
[0, 9] in t2.rb
1 require_relative 't1'
2 require 'ruby-debug'
3
4 debugger
=> 5 foo = Foo.new
6
7 puts 'foo initilized at %s:%s' % foo.initialize_loc
8
t2.rb:5
foo = Foo.new
(rdb:1)
一个简单的s
将会“步进”到下一行代码,该行代码将在Foo
的initialize
块中:
(rdb:1) s
[-1, 8] in /Users/foobar/Desktop/t1.rb
1 class Foo
2 attr_reader :initialize_loc
3 def initialize
=> 4 @initialize_loc = [__FILE__, __LINE__]
5
6 end
7 end
8
/Users/foobar/Desktop/t1.rb:4
@initialize_loc = [__FILE__, __LINE__]
(rdb:1)
除此之外,使用像
grep -rn target_to_find path_to_search
这样的工具来递归搜索目录并列出与目标匹配的行的文件名和行号,将大大帮助您找到您想要的内容。
或者,在 Vim 中使用
:vim /target_to_find/ path_to_search
将返回您要查找的文件。
__FILE__
和__LINE__
) - tomferonsource_location
方法计划在 此错误报告 中被倒退到 1.8.8。 - awendtMethod
对象下调用__file__
以获取源文件,但它不起作用。当然,__FILE__
是可以工作的 :) - Haris Krajina