Hướng dẫn stack trace: #0 (main) thrown in php - dấu vết ngăn xếp: # 0 (chính) được ném trong php

"Backtrace" chuyển hướng ở đây. Đối với bộ phim năm 2018, xem Backtrace (phim).

Trong điện toán, một dấu vết ngăn xếp (còn được gọi là Backtrace Stack [1] hoặc Stack Traceback [2]) là một báo cáo về các khung ngăn xếp hoạt động tại một thời điểm nhất định trong quá trình thực hiện chương trình. Khi một chương trình được chạy, bộ nhớ thường được phân bổ động ở hai nơi; Các ngăn xếp và đống. Bộ nhớ được phân bổ liên tục trên một ngăn xếp nhưng không phải trên một đống, do đó phản ánh tên của chúng. Ngăn xếp cũng đề cập đến một cấu trúc lập trình, do đó để phân biệt nó, ngăn xếp này được gọi là ngăn xếp gọi chức năng của chương trình. Về mặt kỹ thuật, một khi một khối bộ nhớ đã được phân bổ trên ngăn xếp, nó không thể dễ dàng loại bỏ vì có thể có các khối bộ nhớ khác được phân bổ trước nó. Mỗi lần một hàm được gọi trong một chương trình, một khối bộ nhớ được gọi là bản ghi kích hoạt được phân bổ trên đầu ngăn xếp cuộc gọi. Nói chung, bản ghi kích hoạt lưu trữ các đối số của hàm và các biến cục bộ. Chính xác thì nó chứa những gì và cách nó được đặt ra được xác định bởi quy ước gọi.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.

Các lập trình viên thường sử dụng dấu vết ngăn xếp trong quá trình gỡ lỗi tương tác và sau khi chết. Người dùng cuối có thể thấy một dấu vết ngăn xếp được hiển thị như một phần của thông báo lỗi, sau đó người dùng có thể báo cáo cho một lập trình viên.

Một dấu vết ngăn xếp cho phép theo dõi chuỗi các hàm lồng nhau được gọi là - cho đến điểm tạo ra dấu vết ngăn xếp. Trong một kịch bản sau khi chết, điều này mở rộng đến chức năng xảy ra sự thất bại (nhưng không nhất thiết phải gây ra). Các cuộc gọi anh chị em không xuất hiện trong một dấu vết ngăn xếp.

Hỗ trợ ngôn ngữ [Chỉnh sửa][edit]

Nhiều ngôn ngữ lập trình, bao gồm Java [3] và C#, [4] đã hỗ trợ tích hợp để truy xuất dấu vết ngăn xếp hiện tại thông qua các cuộc gọi hệ thống. Trước khi std::stacktrace được thêm vào thư viện tiêu chuẩn dưới dạng container cho std::stacktrace_entry, Pre-C ++ 23 không có hỗ trợ tích hợp để thực hiện việc này, nhưng người dùng C ++ có thể truy xuất dấu vết ngăn xếp với (ví dụ) thư viện StackTrace. Trong JavaScript, các trường hợp ngoại lệ giữ một thuộc tính stack có chứa ngăn xếp từ nơi nó bị ném.

Python[edit][edit]

Ví dụ, chương trình Python sau đây chứa lỗi.

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()

Chạy chương trình theo trình thông dịch Python tiêu chuẩn tạo ra thông báo lỗi sau.

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

Dấu vết ngăn xếp cho thấy lỗi xảy ra, cụ thể là trong hàm

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
0. Nó cũng cho thấy hàm
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
0 được gọi bởi
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
2, được gọi bởi
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
3, lần lượt được gọi bởi mã trên dòng 15 (dòng cuối cùng) của chương trình. Các bản ghi kích hoạt cho mỗi trong ba chức năng này sẽ được sắp xếp trong một ngăn xếp sao cho hàm
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
3 sẽ chiếm phần dưới của ngăn xếp và hàm
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
0 sẽ chiếm phần trên của ngăn xếp.

Java[edit][edit]

Trong Java, dấu vết ngăn xếp có thể được đổ thủ công bằng ________ 16 [5] thực hiện đầu vào sau:

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();
  }
}

Ngoại lệ liệt kê các chức năng theo thứ tự giảm dần, vì vậy cuộc gọi nhất là đầu tiên.

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 và C ++ [Chỉnh sửa][edit]

Cả C và C ++ (Pre-C ++ 23) đều không có hỗ trợ gốc để có được dấu vết ngăn xếp, nhưng các thư viện như Glibc và Boost cung cấp chức năng này. [6] [7] Trong các ngôn ngữ này, một số tối ưu hóa trình biên dịch có thể can thiệp vào thông tin ngăn xếp cuộc gọi có thể được khôi phục khi chạy. Chẳng hạn, nội tuyến có thể gây ra các khung ngăn xếp bị thiếu, tối ưu hóa cuộc gọi đuôi có thể thay thế một khung ngăn xếp bằng một khung khác và loại bỏ khung con có thể ngăn các công cụ phân tích ngăn xếp cuộc gọi diễn giải chính xác nội dung của ngăn xếp cuộc gọi. [6]

Ví dụ: hàm

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
7 của Glibc trả về đầu ra với chức năng chương trình và địa chỉ bộ nhớ.

./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]

Kể từ C ++ 23, dấu vết ngăn xếp có thể được đổ thủ công bằng cách in giá trị được trả về bởi hàm thành viên tĩnh ________ 18: [8]

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

Rust[edit][edit]

Rust có hai loại lỗi. Các chức năng sử dụng macro hoảng loạn là "không thể giải thích được" và chủ đề hiện tại sẽ trở nên đầu độc khi trải qua việc tháo gỡ ngăn xếp. Các chức năng trả về

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
9 có thể phục hồi "và có thể được xử lý một cách duyên dáng. [9] Tuy nhiên, các lỗi có thể phục hồi không thể tạo ra dấu vết ngăn xếp vì chúng được thêm vào thủ công và không phải là kết quả của lỗi thời gian chạy.

Kể từ tháng 6 năm 2021, Rust có hỗ trợ thử nghiệm cho dấu vết ngăn xếp các lỗi không thể phục hồi. Rust hỗ trợ in cho Stderr khi một luồng hoảng loạn, nhưng nó phải được bật bằng cách đặt biến môi trường

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();
  }
}
0. [10]

Khi được bật, các backtraces như vậy trông tương tự như bên dưới, với cuộc gọi gần đây nhất đầu tiên.

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
...

Xem thêm [sửa][edit]

  • Cuộc gọi đuôi
  • Bối cảnh (Điện toán)
  • Stack Overflow
  • Xử lý ngoại lệ
  • Gọi ngăn xếp

References[edit][edit]

  1. ^"Hướng dẫn sử dụng LIBC: Backtraces". gnu.org. Truy cập ngày 8 tháng 7 năm 2014. "libc manual: backtraces". gnu.org. Retrieved 8 July 2014.
  2. ^"Traceback - in hoặc lấy một dấu vết ngăn xếp". Python.org. Truy cập ngày 8 tháng 7 năm 2014. "traceback — Print or retrieve a stack traceback". python.org. Retrieved 8 July 2014.
  3. ^"Chủ đề (Java SE 16 & JDK 16)". Java Platform Standard Edition & Java Development Kit phiên bản 16 Đặc điểm kỹ thuật API. 2021-03-04. Truy cập 2021-07-04. "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. ^"Môi trường.StackTrace Thuộc tính (Hệ thống)". Tài liệu Microsoft. 2021-05-07. Truy cập 2021-07-04. "Environment.StackTrace Property (System)". Microsoft Docs. 2021-05-07. Retrieved 2021-07-04.
  5. ^"Chủ đề (nền tảng Java SE 8)". Docs.oracle.com. Truy cập 2021-06-15. "Thread (Java Platform SE 8 )". docs.oracle.com. Retrieved 2021-06-15.
  6. ^ ab "Backtraces (Thư viện GNU C)". www.gnu.org. Truy cập 2021-06-15.a b "Backtraces (The GNU C Library)". www.gnu.org. Retrieved 2021-06-15.
  7. ^"Bắt đầu - 1.76.0". www.boost.org. Truy cập 2021-06-15. "Getting Started - 1.76.0". www.boost.org. Retrieved 2021-06-15.
  8. ^"Dự thảo làm việc, Tiêu chuẩn cho ngôn ngữ lập trình C ++" (PDF). Open-std.org. ISO/IEC. 2021-10-23. P. & NBSP; 766 .________ 21: CS1 Duy trì: URL-status (liên kết) "Working Draft, Standard for Programming Language C++" (PDF). open-std.org. ISO/IEC. 2021-10-23. p. 766.
    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();
      }
    }
    
    1: CS1 maint: url-status (link)
  9. ^"Rushonomicon thư giãn - rỉ sét". DOC.RUST-LANG.ORG. "rustonomicon unwinding - Rust". doc.rust-lang.org.
  10. ^"Std :: Backtrace - Rust". DOC.RUST-LANG.ORG. Truy cập 2021-06-15. "std::backtrace - Rust". doc.rust-lang.org. Retrieved 2021-06-15.

Dấu vết ngăn xếp là gì?

Dấu vết ngăn xếp có nghĩa là gì? Dấu vết ngăn xếp là một báo cáo cung cấp thông tin về chương trình con chương trình. Nó thường được sử dụng cho một số loại gỡ lỗi nhất định, trong đó một dấu vết ngăn xếp có thể giúp các kỹ sư phần mềm tìm ra vấn đề nằm ở đâu hoặc cách các chương trình con khác nhau hoạt động cùng nhau trong quá trình thực hiện.a report that provides information about program subroutines. It is commonly used for certain kinds of debugging, where a stack trace can help software engineers figure out where a problem lies or how various subroutines work together during execution.

Điều gì gây ra dấu vết ngăn xếp?

Thông thường, một dấu vết ngăn xếp được hiển thị khi một ngoại lệ không được xử lý chính xác trong mã. .when an Exception is not handled correctly in code. (An exception is what a runtime environment uses to tell you that there's an error in your code.) This may be one of the built-in Exception types, or a custom Exception created by a program or a library.

Lỗi dấu vết ngăn xếp là gì?

Lỗi theo dõi ngăn xếp là một thuật ngữ chung thường được liên kết với các thông báo lỗi dài.Thông tin theo dõi ngăn xếp xác định nơi trong chương trình xảy ra lỗi và hữu ích cho các lập trình viên.Đối với người dùng, thông tin theo dõi ngăn xếp dài có thể không hữu ích cho việc khắc phục lỗi web.a generic term frequently associated with long error messages. The stack trace information identifies where in the program the error occurs and is helpful to programmers. For users, the long stack track information may not be very useful for troubleshooting web errors.

Dấu vết ngăn xếp trong cơ sở dữ liệu là gì?

Trong điện toán, một dấu vết ngăn xếp (còn được gọi là Stack Backtrace hoặc Stack Traceback) là một báo cáo về các khung ngăn xếp hoạt động tại một thời điểm nhất định trong quá trình thực hiện chương trình.Khi một chương trình được chạy, bộ nhớ thường được phân bổ động ở hai nơi;Các ngăn xếp và đống.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.