NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
stacktrace.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_SYSTEM_STACKTRACE_HPP__
2#define NEFORCE_CORE_SYSTEM_STACKTRACE_HPP__
3
11
14NEFORCE_BEGIN_NAMESPACE__
15
21
29class NEFORCE_API stacktrace : public istringify<stacktrace> {
30public:
37 class NEFORCE_API frame : public istringify<frame> {
38 private:
39 void* address_ = nullptr;
40
41 public:
45 frame() noexcept = default;
46
51 explicit frame(void* addr) noexcept :
52 address_(addr) {}
53
58 NEFORCE_NODISCARD void* address() const noexcept { return address_; }
59
66 NEFORCE_NODISCARD string name() const;
67
72 NEFORCE_NODISCARD string source_file() const;
73
78 NEFORCE_NODISCARD size_t source_line() const;
79
85 NEFORCE_NODISCARD bool operator==(const frame& other) const noexcept { return address_ == other.address_; }
86
92 NEFORCE_NODISCARD bool operator!=(const frame& other) const noexcept { return !(*this == other); }
93
100 NEFORCE_NODISCARD string to_string() const;
101 };
102
111
118 friend constexpr format_flags operator|(format_flags a, format_flags b) noexcept {
119 return static_cast<format_flags>(static_cast<int>(a) | static_cast<int>(b));
120 }
121
128 friend constexpr format_flags operator&(format_flags a, format_flags b) noexcept {
129 return static_cast<format_flags>(static_cast<int>(a) & static_cast<int>(b));
130 }
131
132private:
133 vector<frame> frames_;
134
135public:
143 explicit stacktrace(size_t skip = 0, size_t max_depth = 64);
144
151 NEFORCE_NODISCARD static stacktrace current(size_t skip = 0, size_t max_depth = 64);
152
161 NEFORCE_NODISCARD static stacktrace from_exception(const exception_ptr& ep, size_t max_depth = 64);
162
167 NEFORCE_NODISCARD size_t size() const noexcept { return frames_.size(); }
168
173 NEFORCE_NODISCARD bool empty() const noexcept { return frames_.empty(); }
174
180 NEFORCE_NODISCARD const frame& operator[](const size_t idx) const noexcept { return frames_[idx]; }
181
187 NEFORCE_NODISCARD frame& operator[](const size_t idx) noexcept { return frames_[idx]; }
188
193 NEFORCE_NODISCARD auto begin() const noexcept { return frames_.begin(); }
194
199 NEFORCE_NODISCARD auto end() const noexcept { return frames_.end(); }
200
205 NEFORCE_NODISCARD auto cbegin() const noexcept { return frames_.cbegin(); }
206
211 NEFORCE_NODISCARD auto cend() const noexcept { return frames_.cend(); }
212
219 NEFORCE_NODISCARD string to_string() const;
220
226 NEFORCE_NODISCARD string to_string(format_flags flags) const;
227};
228 // Stacktrace
230
231NEFORCE_END_NAMESPACE__
232#endif // NEFORCE_CORE_SYSTEM_STACKTRACE_HPP__
size_t source_line() const
获取源文件行号
bool operator==(const frame &other) const noexcept
相等比较
string source_file() const
获取源文件路径
string name() const
获取函数符号名称
void * address() const noexcept
获取返回地址
frame() noexcept=default
默认构造函数
string to_string() const
转换为字符串
bool operator!=(const frame &other) const noexcept
不等比较
string to_string() const
转换为字符串
string to_string(format_flags flags) const
以指定格式转换为字符串
size_t size() const noexcept
获取堆栈深度
format_flags
格式化标志
auto cbegin() const noexcept
获取起始常量迭代器
auto end() const noexcept
获取结束常量迭代器
static stacktrace from_exception(const exception_ptr &ep, size_t max_depth=64)
从异常指针获取堆栈跟踪
const frame & operator[](const size_t idx) const noexcept
常量索引访问
friend constexpr format_flags operator&(format_flags a, format_flags b) noexcept
格式化标志位与运算
frame & operator[](const size_t idx) noexcept
索引访问
auto begin() const noexcept
获取起始常量迭代器
bool empty() const noexcept
检查堆栈是否为空
friend constexpr format_flags operator|(format_flags a, format_flags b) noexcept
格式化标志位或运算
auto cend() const noexcept
获取结束常量迭代器
stacktrace(size_t skip=0, size_t max_depth=64)
构造函数,捕获当前堆栈
static stacktrace current(size_t skip=0, size_t max_depth=64)
获取当前线程堆栈
动态大小数组容器
异常指针实现
可字符串化接口
可字符串化接口