如何在Ruby中获取堆栈跟踪对象?

我需要在Ruby中获取堆栈跟踪对象; 不要打印它,只是为了进行一些记录和转储以供以后分析。 那可能吗? 怎么样?

pupeno asked 2019-11-07T09:06:09Z
6个解决方案
79 votes

您可以为此使用Kernel.caller。 生成异常的堆栈跟踪时,使用相同的方法。

来自文档:

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"]
Sven Koschnicke answered 2019-11-07T09:06:30Z
31 votes

尝试

Thread.current.backtrace.join("\n")
Alex Bondar answered 2019-11-07T09:06:49Z
13 votes

试试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
Nikita Rybak answered 2019-11-07T09:07:17Z
7 votes

对于Ruby 2.0+,您可以使用nil。它与nil(在Sven Koschnicke的答案中发现)基本相同,不同之处在于,它不返回字符串数组,而是返回nil对象数组。 nil提供了诸如nilnilnil之类的方法,当您需要访问有关堆栈跟踪的特定详细信息而不仅仅是原始字符串时,这些方法可能很有用。

来自文档:

caller_locations(start = 1,length = nil)→数组或零

caller_locations(range)→数组或无

返回当前执行堆栈-包含backtrace的数组   位置对象。

有关更多信息,请参见nil

可选的start参数确定初始堆栈数   从堆栈顶部省略的条目。

第二个可选的nil参数可用于限制有多少个   条目从堆栈中返回。

如果start大于当前执行的大小,则返回nil   堆。

(可选)您可以传递一个范围,该范围将返回包含以下内容的数组   指定范围内的条目。

用法示例:

def a
  caller_locations(0)
end
def b
  a
end
def c
  b
end

c.map(&:base_label)
#=> ["a", "b", "c", "<main>"]
Ajedi32 answered 2019-11-07T09:08:42Z
3 votes
Thread.current.backtrace

这将为您提供一个数组,其中包含您可能在任何常规回溯中获得的所有行。

Rajat Bansal answered 2019-11-07T09:09:08Z
2 votes

如果需要,也可以创建自己的。 正如拉斯·奥尔森(Russ Olsen)在《雄辩的红宝石》中所展示的:

# 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)
Sammy Larbi answered 2019-11-07T09:09:33Z
translate from https://stackoverflow.com:/questions/3829157/how-to-get-a-stack-trace-object-in-ruby