fbpx
Wikipedia

Stack trace

In computing, a stack trace (also called stack backtrace[1] or stack traceback[2]) is a report of the active stack frames at a certain point in time during the execution of a program. When a program is run, memory is often dynamically allocated in two places; the stack and the heap. Memory is continuously allocated on a stack but not on a heap, thus reflective of their names. Stack also refers to a programming construct, thus to differentiate it, this stack is referred to as the program's function call stack. Technically, once a block of memory has been allocated on the stack, it cannot be easily removed as there can be other blocks of memory that were allocated before it. Each time a function is called in a program, a block of memory called an activation record is allocated on top of the call stack. Generally, the activation record stores the function's arguments and local variables. What exactly it contains and how it's laid out is determined by the calling convention.

Programmers commonly use stack tracing during interactive and post-mortem debugging. End-users may see a stack trace displayed as part of an error message, which the user can then report to a programmer.

A stack trace allows tracking the sequence of nested functions called - up to the point where the stack trace is generated. In a post-mortem scenario this extends up to the function where the failure occurred (but was not necessarily caused). Sibling calls do not appear in a stack trace.

Language support edit

Many programming languages, including Java[3] and C#,[4] have built-in support for retrieving the current stack trace via system calls. Before std::stacktrace was added in standard library as a container for std::stacktrace_entry, pre-C++23 has no built-in support for doing this, but C++ users can retrieve stack traces with (for example) the stacktrace library. In JavaScript, exceptions hold a stack property that contain the stack from the place where it was thrown.

Python edit

As an example, the following Python program contains an error.

def a():  i = 0  j = b(i)  return j  def b(z):  k = 5  if z == 0:  c()  return k + z  def c():  error()  a() 

Running the program under the standard Python interpreter produces the following error message.

Traceback (most recent call last): File "tb.py", line 15, in <module>  a() File "tb.py", line 3, in a  j = b(i) File "tb.py", line 9, in b  c() File "tb.py", line 13, in c  error() NameError: name 'error' is not defined 

The stack trace shows where the error occurs, namely in the c function. It also shows that the c function was called by b, which was called by a, which was in turn called by the code on line 15 (the last line) of the program. The activation records for each of these three functions would be arranged in a stack such that the a function would occupy the bottom of the stack and the c function would occupy the top of the stack.

Java edit

In Java, stack traces can be dumped manually with Thread.dumpStack()[5] Take the following input:

public class Main {  public static void main(String args[]) {  demo();  }  static void demo() {  demo1();  }  static void demo1() {  demo2();  }  static void demo2() {  demo3();  }  static void demo3() {  Thread.dumpStack();  } } 

The exception lists functions in descending order, so the most-inner call is first.

java.lang.Exception: Stack trace  at java.lang.Thread.dumpStack(Thread.java:1336)  at Main.demo3(Main.java:15)  at Main.demo2(Main.java:12)  at Main.demo1(Main.java:9)  at Main.demo(Main.java:6)  at Main.main(Main.java:3) 

C and C++ edit

Both C and C++ (pre-C++23) do not have native support for obtaining stack traces, but libraries such as glibc and boost provide this functionality.[6][7] In these languages, some compiler optimizations may interfere with the call stack information that can be recovered at runtime. For instance, inlining can cause missing stack frames, tail call optimizations can replace one stack frame with another, and frame pointer elimination can prevent call stack analysis tools from correctly interpreting the contents of the call stack.[6]

For example, glibc's backtrace() function returns an output with the program function and memory address.

./a.out() [0x40067f] ./a.out() [0x4006fe] ./a.out() [0x40070a] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f7e60738f45] ./a.out() [0x400599] 

As of C++23, stack traces can be dumped manually by printing the value returned by static member function std::stacktrace::current():[8]

std::cout << std::stacktrace::current() << '\n'; 

Rust edit

Rust has two types of errors. Functions that use the panic macro are "unrecoverable" and the current thread will become poisoned experiencing stack unwinding. Functions that return a std::result::Result are "recoverable" and can be handled gracefully.[9] However, recoverable errors cannot generate a stack trace as they are manually added and not a result of a runtime error.

As of June 2021, Rust has experimental support for stack traces on unrecoverable errors. Rust supports printing to stderr when a thread panics, but it must be enabled by setting the RUST_BACKTRACE environment variable.[10]

When enabled, such backtraces look similar to below, with the most recent call first.

thread 'main' panicked at 'execute_to_panic', main.rs:3 stack backtrace: 0: std::sys::imp::backtrace::tracing::imp::unwind_backtrace  1: std::panicking::default_hook::{{closure}}  2: std::panicking::default_hook  3: std::panicking::rust_panic_with_hook  4: std::panicking::begin_panic  5: futures::task_impl::with  6: futures::task_impl::park ... 

See also edit

References edit

  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.
  9. ^ "rustonomicon unwinding - Rust". doc.rust-lang.org.
  10. ^ "std::backtrace - Rust". doc.rust-lang.org. Retrieved 2021-06-15.

stack, trace, backtrace, redirects, here, 2018, film, backtrace, film, computing, stack, trace, also, called, stack, backtrace, stack, traceback, report, active, stack, frames, certain, point, time, during, execution, program, when, program, memory, often, dyn. Backtrace redirects here For the 2018 film see Backtrace film In computing a stack trace also called stack backtrace 1 or stack traceback 2 is a report of the active stack frames at a certain point in time during the execution of a program When a program is run memory is often dynamically allocated in two places the stack and the heap Memory is continuously allocated on a stack but not on a heap thus reflective of their names Stack also refers to a programming construct thus to differentiate it this stack is referred to as the program s function call stack Technically once a block of memory has been allocated on the stack it cannot be easily removed as there can be other blocks of memory that were allocated before it Each time a function is called in a program a block of memory called an activation record is allocated on top of the call stack Generally the activation record stores the function s arguments and local variables What exactly it contains and how it s laid out is determined by the calling convention Programmers commonly use stack tracing during interactive and post mortem debugging End users may see a stack trace displayed as part of an error message which the user can then report to a programmer A stack trace allows tracking the sequence of nested functions called up to the point where the stack trace is generated In a post mortem scenario this extends up to the function where the failure occurred but was not necessarily caused Sibling calls do not appear in a stack trace Contents 1 Language support 1 1 Python 1 2 Java 1 3 C and C 1 4 Rust 2 See also 3 ReferencesLanguage support editMany programming languages including Java 3 and C 4 have built in support for retrieving the current stack trace via system calls Before std stacktrace was added in standard library as a container for std stacktrace entry pre C 23 has no built in support for doing this but C users can retrieve stack traces with for example the stacktrace library In JavaScript exceptions hold a stack property that contain the stack from the place where it was thrown Python edit As an example the following Python program contains an error def a i 0 j b i return j def b z k 5 if z 0 c return k z def c error a Running the program under the standard Python interpreter produces the following error message Traceback most recent call last File tb py line 15 in lt module gt a File tb py line 3 in a j b i File tb py line 9 in b c File tb py line 13 in c error NameError name error is not defined The stack trace shows where the error occurs namely in the c function It also shows that the c function was called by b which was called by a which was in turn called by the code on line 15 the last line of the program The activation records for each of these three functions would be arranged in a stack such that the a function would occupy the bottom of the stack and the c function would occupy the top of the stack Java edit In Java stack traces can be dumped manually with Thread dumpStack 5 Take the following input public class Main public static void main String args demo static void demo demo1 static void demo1 demo2 static void demo2 demo3 static void demo3 Thread dumpStack The exception lists functions in descending order so the most inner call is first java lang Exception Stack trace at java lang Thread dumpStack Thread java 1336 at Main demo3 Main java 15 at Main demo2 Main java 12 at Main demo1 Main java 9 at Main demo Main java 6 at Main main Main java 3 C and C edit Both C and C pre C 23 do not have native support for obtaining stack traces but libraries such as glibc and boost provide this functionality 6 7 In these languages some compiler optimizations may interfere with the call stack information that can be recovered at runtime For instance inlining can cause missing stack frames tail call optimizations can replace one stack frame with another and frame pointer elimination can prevent call stack analysis tools from correctly interpreting the contents of the call stack 6 For example glibc s backtrace function returns an output with the program function and memory address a out 0x40067f a out 0x4006fe a out 0x40070a lib x86 64 linux gnu libc so 6 libc start main 0xf5 0x7f7e60738f45 a out 0x400599 As of C 23 stack traces can be dumped manually by printing the value returned by static member function std stacktrace current 8 std cout lt lt std stacktrace current lt lt n Rust edit Rust has two types of errors Functions that use the panic macro are unrecoverable and the current thread will become poisoned experiencing stack unwinding Functions that return a std result Result are recoverable and can be handled gracefully 9 However recoverable errors cannot generate a stack trace as they are manually added and not a result of a runtime error As of June 2021 Rust has experimental support for stack traces on unrecoverable errors Rust supports printing to stderr when a thread panics but it must be enabled by setting the RUST BACKTRACE environment variable 10 When enabled such backtraces look similar to below with the most recent call first thread main panicked at execute to panic main rs 3 stack backtrace 0 std sys imp backtrace tracing imp unwind backtrace 1 std panicking default hook closure 2 std panicking default hook 3 std panicking rust panic with hook 4 std panicking begin panic 5 futures task impl with 6 futures task impl park See also editTail call Context computing Stack overflow Exception handling Call stackReferences edit libc manual backtraces gnu org Retrieved 8 July 2014 traceback Print or retrieve a stack traceback python org Retrieved 8 July 2014 Thread Java SE 16 amp JDK 16 Java Platform Standard Edition amp Java Development Kit Version 16 API Specification 2021 03 04 Retrieved 2021 07 04 Environment StackTrace Property System Microsoft Docs 2021 05 07 Retrieved 2021 07 04 Thread Java Platform SE 8 docs oracle com Retrieved 2021 06 15 a b Backtraces The GNU C Library www gnu org Retrieved 2021 06 15 Getting Started 1 76 0 www boost org Retrieved 2021 06 15 Working Draft Standard for Programming Language C PDF open std org ISO IEC 2021 10 23 p 766 rustonomicon unwinding Rust doc rust lang org std backtrace Rust doc rust lang org Retrieved 2021 06 15 Retrieved from https en wikipedia org w index php title Stack trace amp oldid 1188527581, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.