스택 트레이스

Stack trace

컴퓨팅에서 스택트레이스(스택[1] 백트레이스 또는 스택트레이스라고도[2] 불립니다)는 프로그램 실행 중 특정 시점에서 액티브한 스택프레임의 보고서입니다프로그램이 실행되면 메모리는 스택의 두 곳에 동적으로 할당됩니다.메모리는 스택에 연속적으로 할당되지만 힙에는 할당되지 않기 때문에 이름이 반영됩니다.스택은 또한 프로그래밍 구성을 나타내므로 이를 구별하기 위해 이 스택을 프로그램의 함수 호출 스택이라고 합니다.기술적으로 메모리 블록이 스택에 할당되면 그 전에 할당된 다른 메모리 블록이 있을 수 있기 때문에 쉽게 제거할 수 없습니다.프로그램에서 함수가 호출될 때마다 활성화 레코드라고 불리는 메모리 블록이 콜 스택 위에 할당됩니다.일반적으로 활성화 레코드는 함수의 인수와 로컬 변수를 저장합니다.정확히 무엇을 포함하고 어떻게 배치되는지는 호출 규칙에 따라 결정됩니다.

프로그래머는 일반적으로 인터랙티브 및 사후 디버깅 에 스택트레이스를 사용합니다.최종 사용자는 오류 메시지의 일부로 스택트레이스를 표시할 수 있습니다.이러한 트레이스는 프로그래머에게 보고할 수 있습니다.

스택 트레이스를 사용하면 스택트레이스가 생성되는 시점까지 호출된 중첩된 함수의 시퀀스를 추적할 수 있습니다.사후 시나리오에서는 장애가 발생한 기능까지 확장됩니다(단, 반드시 원인은 아닙니다).형제 콜은 스택트레이스에 표시되지 않습니다.

언어 지원

Java 및 C#[4]포함[3] 많은 프로그래밍 언어에는 시스템콜을 통해 현재 스택트레이스를 취득하는 기능이 내장되어 있습니다.전에std::stacktrace를 위한 컨테이너로 표준 라이브러리에 추가되었습니다.std::stacktrace_entry , pre-C++23 에서는 이 처리를 위한 내장 지원은 없습니다만, C++ 사용자는 스택 트레이스 라이브러리(예를 들면)를 사용해 스택트레이스를 취득할 수 있습니다.JavaScript에서는 예외는stack스택을 포함하는 속성입니다.

파이썬

예를 들어, 다음 Python 프로그램에 오류가 있습니다.

방어하다 a():     i = 0     j = b(i)     돌아가다 j  방어하다 b(z):     k = 5     한다면 z == 0:         c()     돌아가다 k + z  방어하다 c():     에러()  a() 

표준 Python 인터프리터에서 프로그램을 실행하면 다음과 같은 오류 메시지가 나타납니다.

트레이스백(최신 콜의 마지막):j = b(i) 파일 "tb.py"의 파일 "tb.py"의 줄 3의 파일 "tb.py", b() 파일 "tb.py"의 줄 9의 파일 "tb.py", c error() NameError: 이름 'error'가 정의되지 않았습니다.

스택 트레이스는 에러가 발생한 장소, 즉c기능.또, 그 결과,c함수가 호출되었습니다.b에 의해 호출되었습니다.a프로그램의 15행(마지막 행)의 코드로 호출되었습니다.이 세 가지 기능 각각에 대한 활성화 레코드는 스택에 배치되어 다음과 같이 처리됩니다.a함수는 스택의 하단과c함수가 스택의 상단을 차지합니다.

자바

Java에서는 스택트레이스를 수동으로 덤프할 수 있습니다.Thread.dumpStack()[5] 다음과 같이 입력합니다.

일반의 학급 주된 {   일반의 정적인 무효 주된(스트링 args[]) {     데모();   }   정적인 무효 데모() {     데모 1();   }   정적인 무효 데모 1() {     데모 2();   }   정적인 무효 데모 2() {     데모 3();   }   정적인 무효 데모 3() {     .덤프 스택();   } } 

예외는 함수를 내림차순으로 나열하기 때문에 가장 내부가 큰 콜이 첫 번째가 됩니다.

자바.언어.예외.: 스택 추적하다          자바.언어..덤프 스택(.자바:1336)          주된.데모 3(주된.자바:15)          주된.데모 2(주된.자바:12)          주된.데모 1(주된.자바:9)          주된.데모(주된.자바:6)          주된.주된(주된.자바:3) 

C 및 C++

C와 C++(Pre-C++23) 모두 스택트레이스 취득을 네이티브로 지원하지 않지만 glibc나 boost 등의 라이브러리가 [6][7]이 기능을 제공합니다.이러한 언어에서는 일부 컴파일러 최적화가 실행 시 회복 가능한 콜스택 정보를 방해할 수 있습니다.를 들어 인라이닝에 의해 스택프레임이 없어지고 테일콜 최적화가 스택프레임을 다른 스택프레임으로 대체하고 프레임포인터 삭제로 콜스택 분석 [6]툴이 콜스택의 내용을 올바르게 해석할 수 없게 되는 경우가 있습니다.

예를 들어 glibc의backtrace()함수는 프로그램 함수와 메모리 주소가 포함된 출력을 반환합니다.

./a.나가.() [0x40067f] ./a.나가.() [0x4006fe] ./a.나가.() [0x40070a] /lib/x86_64-리눅스-gnu/libc.그렇게.6(__libc_start_main+0xf5) [0x7f7e60738f45] ./a.나가.() [0x400599] 

C++23에서는 스태틱멤버 함수에 의해 반환되는 값을 인쇄함으로써 스택트레이스를 수동으로 덤프할 수 있습니다.std::stacktrace::current()다음과 같습니다.[8]

표준::외치다 << > 표준::스택 트레이스::현재의() << > '\n'; 

에는 두 가지 유형의 오류가 있습니다.패닉 매크로를 사용하는 함수는 "복구 불가능"하며 현재 스레드는 스택이 풀리는 동안 포이즈닝됩니다.를 반환하는 함수std::result::Result[9]불가능」하고, 우아하게 처리할 수 있습니다.그러나 복구 가능한 오류는 실행 시 오류가 아닌 수동으로 추가되므로 스택 트레이스를 생성할 수 없습니다.

2021년 6월 현재 Rust는 복구할 수 없는 오류에 대한 스택 트레이스를 실험적으로 지원하고 있습니다.Rust는 스레드가 패닉할 때 stderr에 대한 인쇄를 지원하지만 다음 설정을 통해 활성화해야 합니다.RUST_BACKTRACE 환경 [10]변수입니다.

이네이블의 경우, 이러한 백트레이스는 다음과 같이 표시됩니다.최신 콜이 먼저 표시됩니다.

스레드 'main'이 'main_to_panicking', main.rs:3 스택 역추적: 0: std::sys:imp:backtrace:imp:imp:infind_backtrace 1: std:panicking:default_hook:{{closure} 2: std:: 패닉: default_hook 3: std:: 패닉: std:: 패닉: rust_hook_with_hook 4: std: 패닉: futures:: task_hook: futures: with 6: park... 

「 」를 참조해 주세요.

레퍼런스

  1. ^ "libc manual: backtraces". gnu.org. Retrieved 8 July 2014.
  2. ^ "traceback — Print or retrieve a stack traceback". python.org. Retrieved 8 July 2014.
  3. ^ "Thread (Java SE 16 & JDK 16)". Java Platform Standard Edition & Java Development Kit Version 16 API Specification. 2021-03-04. Retrieved 2021-07-04.
  4. ^ "Environment.StackTrace Property (System)". Microsoft Docs. 2021-05-07. Retrieved 2021-07-04.
  5. ^ "Thread (Java Platform SE 8 )". docs.oracle.com. Retrieved 2021-06-15.
  6. ^ a b "Backtraces (The GNU C Library)". www.gnu.org. Retrieved 2021-06-15.
  7. ^ "Getting Started - 1.76.0". www.boost.org. Retrieved 2021-06-15.
  8. ^ "Working Draft, Standard for Programming Language C++" (PDF). open-std.org. ISO/IEC. 2021-10-23. p. 766.{{cite web}}: CS1 maint :url-status (링크)
  9. ^ "rustonomicon unwinding - Rust". doc.rust-lang.org.
  10. ^ "std::backtrace - Rust". doc.rust-lang.org. Retrieved 2021-06-15.