C++23 - stacktrace_entry class 有什么好处?
C++23 - What are the benefits of the stacktrace_entry class?
当头文件中的这个class被添加到语言中后,我们将能够更轻松地处理哪些问题以及计划替换哪些语法?下面我分享了我从 cppreference 网站获得的代码。
Class std::stacktrace_entry
namespace std {
class stacktrace_entry {
public:
using native_handle_type = /* implementation-defined */;
// constructors
constexpr stacktrace_entry() noexcept;
constexpr stacktrace_entry(const stacktrace_entry& other) noexcept;
constexpr stacktrace_entry& operator=(const stacktrace_entry& other) noexcept;
~stacktrace_entry();
// observers
constexpr native_handle_type native_handle() const noexcept;
constexpr explicit operator bool() const noexcept;
// query
string description() const;
string source_file() const;
uint_least32_t source_line() const;
// comparison
friend constexpr bool operator==(const stacktrace_entry& x,
const stacktrace_entry& y) noexcept;
friend constexpr strong_ordering operator<=>(const stacktrace_entry& x,
const stacktrace_entry& y) noexcept;
};
}
当您使用调试器附加到 C++ 程序并停止执行时,相对容易做的一件事(使用一些编译时工具)是在给定点计算代码的调用堆栈。
一般来说,C++的实现是调用栈是一个链表(可能以非平凡的方式存储),当你return从一个函数跳转到调用者的地方当它呼叫你时注入。
调试器可以解码这些地址,然后可以将指令位置映射回 C++ 源代码位置,以及 你如何得到这行代码的漂亮打印 可以生成。根据优化设置,此信息有时可能不准确、丢失某些帧或完全无意义;但它非常有用。
即使没有编译时检测,也可以保存指令指针链,然后有编译时检测的人可以很好地解码它。
有些库可以让 C++ 程序在内部执行此操作,而无需外部调试器。这些包括 boost stacktrace 的库。
这是将此功能添加到 std
库中。
堆栈跟踪是一串帧,帧可以通过这个新的标准库映射到源文件、函数名和行号信息。
一个典型的用例可能是捕捉程序在 C++ 源代码中以无效方式运行的情况,并生成一个日志来报告它在您尝试恢复之前发生的情况,或者只是退出。然后程序员可以查看此堆栈跟踪并获取有关如何修复该错误的信息。
当头文件中的这个class被添加到语言中后,我们将能够更轻松地处理哪些问题以及计划替换哪些语法?下面我分享了我从 cppreference 网站获得的代码。
Class std::stacktrace_entry
namespace std {
class stacktrace_entry {
public:
using native_handle_type = /* implementation-defined */;
// constructors
constexpr stacktrace_entry() noexcept;
constexpr stacktrace_entry(const stacktrace_entry& other) noexcept;
constexpr stacktrace_entry& operator=(const stacktrace_entry& other) noexcept;
~stacktrace_entry();
// observers
constexpr native_handle_type native_handle() const noexcept;
constexpr explicit operator bool() const noexcept;
// query
string description() const;
string source_file() const;
uint_least32_t source_line() const;
// comparison
friend constexpr bool operator==(const stacktrace_entry& x,
const stacktrace_entry& y) noexcept;
friend constexpr strong_ordering operator<=>(const stacktrace_entry& x,
const stacktrace_entry& y) noexcept;
};
}
当您使用调试器附加到 C++ 程序并停止执行时,相对容易做的一件事(使用一些编译时工具)是在给定点计算代码的调用堆栈。
一般来说,C++的实现是调用栈是一个链表(可能以非平凡的方式存储),当你return从一个函数跳转到调用者的地方当它呼叫你时注入。
调试器可以解码这些地址,然后可以将指令位置映射回 C++ 源代码位置,以及 你如何得到这行代码的漂亮打印 可以生成。根据优化设置,此信息有时可能不准确、丢失某些帧或完全无意义;但它非常有用。
即使没有编译时检测,也可以保存指令指针链,然后有编译时检测的人可以很好地解码它。
有些库可以让 C++ 程序在内部执行此操作,而无需外部调试器。这些包括 boost stacktrace 的库。
这是将此功能添加到 std
库中。
堆栈跟踪是一串帧,帧可以通过这个新的标准库映射到源文件、函数名和行号信息。
一个典型的用例可能是捕捉程序在 C++ 源代码中以无效方式运行的情况,并生成一个日志来报告它在您尝试恢复之前发生的情况,或者只是退出。然后程序员可以查看此堆栈跟踪并获取有关如何修复该错误的信息。