IT TIP

Ruby에서 스택 추적 객체를 얻는 방법은 무엇입니까?

itqueen 2020. 12. 14. 21:26
반응형

Ruby에서 스택 추적 객체를 얻는 방법은 무엇입니까?


Ruby에서 스택 추적 개체를 가져와야합니다. 인쇄하지 말고 나중에 분석하기 위해 기록하고 덤핑하도록합니다. 가능합니까? 어떻게?


이를 위해 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"]

시험

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의 답변 에서 다룹니다 )와 동일 Thread::Backtrace::Location합니다. Thread::Backtrace::Location다음과 같은 방법을 제공합니다 path, lineno그리고 base_label당신은 단지 원시 문자열을 스택 추적에 대한 특정 정보에 액세스하고, 필요시 유용 할 수있다.

From the docs:

caller_locations(start=1, length=nil) → array or nil

caller_locations(range) → array or nil

Returns the current execution stack—an array containing backtrace location objects.

See Thread::Backtrace::Location for more information.

The optional start parameter determines the number of initial stack entries to omit from the top of the stack.

A second optional length parameter can be used to limit how many entries are returned from the stack.

Returns nil if start is greater than the size of current execution stack.

Optionally you can pass a range, which will return an array containing the entries within the specified range.

Usage example:

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

c.map(&:base_label)
#=> ["a", "b", "c", "<main>"]

Thread.current.backtrace

This will give you an array which contains all the lines that you may get in any normal backtrace.


You can create your own if you want as well. As demonstrated in Eloquent Ruby by 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)

참고URL : https://stackoverflow.com/questions/3829157/how-to-get-a-stack-trace-object-in-ruby

반응형