LeviLamina
Loading...
Searching...
No Matches
StacktraceUtils.h
1#pragma once
2
3#include <atomic>
4#include <optional>
5#include <string>
6#include <vector>
7
8#include "ll/api/base/Macro.h"
9#include "ll/api/base/StdInt.h"
10
11namespace ll {
12
13class Stacktrace;
14
15class StacktraceEntry {
16 friend ::ll::Stacktrace;
17 void* address{};
18
19public:
20 using native_handle_type = void*;
21
22 explicit StacktraceEntry(void* address) : address(address) {}
23
24 void* native_handle() const { return address; }
25};
27 std::vector<StacktraceEntry> entries;
28 uint64 hash;
29
30public:
31 LLNDAPI static Stacktrace current(size_t skip = 0, size_t maxDepth = ~0ull);
32 LLNDAPI static Stacktrace fromThread(std::thread::id id);
33
34 uint64 getHash() const { return hash; }
35
36 size_t size() const { return entries.size(); }
37
38 bool empty() const { return entries.empty(); }
39
40 StacktraceEntry const& operator[](size_t index) const { return entries[index]; }
41};
42} // namespace ll
43
44namespace std {
45template <>
46struct hash<ll::StacktraceEntry> {
47 [[nodiscard]] size_t operator()(ll::StacktraceEntry const& val) const noexcept {
48 return hash<ll::StacktraceEntry::native_handle_type>{}(val.native_handle());
49 }
50};
51template <>
52struct hash<ll::Stacktrace> {
53 [[nodiscard]] size_t operator()(ll::Stacktrace const& val) const noexcept { return val.getHash(); }
54};
55} // namespace std
56
57namespace ll::inline utils::stacktrace_utils {
58class SymbolLoader {
59 void* handle;
60 static std::atomic_size_t count;
61
62public:
63 SymbolLoader(SymbolLoader const&) = delete;
64 SymbolLoader& operator=(SymbolLoader const&) = delete;
65
66 LLAPI SymbolLoader();
67 LLAPI SymbolLoader(std::string_view);
68 LLAPI ~SymbolLoader();
69};
70
72 std::optional<size_t> displacement;
73 std::string name;
74 std::optional<ulong> line;
75 std::string file;
76};
77
78LLNDAPI StackTraceEntryInfo getInfo(StacktraceEntry const&);
79LLNDAPI std::string toString(StacktraceEntry const&);
80LLNDAPI std::string toString(Stacktrace const&);
81} // namespace ll::inline utils::stacktrace_utils
Definition StacktraceUtils.h:15
Definition StacktraceUtils.h:26
STL namespace.
Definition StacktraceUtils.h:71