如何在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提供了诸如pathlinenobase_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 

这将给你一个数组,其中包含所有在任何正常回溯中可能获得的行。