如何在Ruby中获取堆栈跟踪对象?
我需要在Ruby中获得堆栈跟踪对象; 不打印它,只是为了让它做一些logging和倾销,以供以后分析。 那可能吗? 怎么样?
你可以使用这个Kernel.caller 。 生成exception堆栈跟踪时使用相同的方法。
从文档:
def a(skip) caller(skip) end def b(skip) a(skip) end def c(skip) b(skip) end c(0) #=> ["prog:2:in `a'", "prog:5:in `b'", "prog:8:in `c'", "prog:10"] c(1) #=> ["prog:5:in `b'", "prog:8:in `c'", "prog:11"] c(2) #=> ["prog:8:in `c'", "prog:12"] c(3) #=> ["prog:13"]
尝试
Thread.current.backtrace.join("\n")
尝试error.backtrace :
# Returns any backtrace associated with the exception. # The backtrace is an array of strings, each containing either ``filename:lineNo: in `method''' or ``filename:lineNo.'' def a raise "boom" end def b a() end begin b() rescue => detail print detail.backtrace.join("\n") end
生产:
prog.rb:2:in `a' prog.rb:6:in `b' prog.rb:10
对于Ruby 2.0+,可以使用Kernel#caller_locations
。 它与Kernel#caller
基本相同(在Sven Koschnicke的回答中已经介绍过 ),除了不是返回一个string数组,而是返回一个Thread::Backtrace::Location
对象的数组。 Thread::Backtrace::Location
提供了诸如path
, lineno
和base_label
,当你需要访问关于栈跟踪的特定细节而不仅仅是一个原始的string的时候,这些方法可能会很有用。
从文档 :
caller_locations(start = 1,length = nil)→array或nil
caller_locations(range)→array或nil
返回当前执行堆栈 – 包含回溯位置对象的数组。
有关更多信息,请参阅
Thread::Backtrace::Location
。可选的启动参数决定堆栈顶部要忽略的初始堆栈条目的数量。
第二个可选的
length
参数可以用来限制堆栈返回的条目数量。如果
start
大于当前执行堆栈的大小,则返回nil
。可选地,您可以传递一个范围,它将返回一个包含指定范围内条目的数组。
用法示例:
def a caller_locations(0) end def b a end def c b end c.map(&:base_label) #=> ["a", "b", "c", "<main>"]
如果你想要,你也可以创build自己的。 正如Russ Olsen的雄辩的Ruby所展示的那样:
# define a proc to use that will handle your trace proc_object = proc do |event, file, line, id, binding, klass| puts "#{event} in #{file}/#{line} #{id} #{klass}" end # tell Ruby to use your proc on traceable events set_trace_func(proc_object)
Thread.current.backtrace
这将给你一个数组,其中包含所有在任何正常回溯中可能获得的行。