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
ifstart
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
'IT TIP' 카테고리의 다른 글
Java 스택 오버플로 오류-Eclipse에서 스택 크기를 늘리는 방법은 무엇입니까? (0) | 2020.12.14 |
---|---|
Java에서 정적 메서드를 재정의하고 오버로드 할 수 있습니까? (0) | 2020.12.14 |
드래그 할 때 Google지도 이벤트 bounds_changed가 여러 번 트리거 됨 (0) | 2020.12.14 |
DataTable의 열을 목록으로 변환하는 방법 (0) | 2020.12.14 |
Chrome JavaScript Debugger 사용 / 페이지 로딩 이벤트 중단 방법 (0) | 2020.12.14 |