Update stacktrace api and a couple minor tweaks
This commit is contained in:
parent
57f5cc529c
commit
a540803cd9
@ -121,7 +121,7 @@ if(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
# Attempt to auto-config
|
# Attempt to auto-config
|
||||||
if(HAS_STACKTRACE AND NOT WIN32)
|
if(HAS_STACKTRACE AND NOT WIN32) # Our trace is better than msvc's <stacktrace>
|
||||||
set(CPPTRACE_FULL_TRACE_WITH_LIBBACKTRACE On)
|
set(CPPTRACE_FULL_TRACE_WITH_LIBBACKTRACE On)
|
||||||
message(STATUS "Cpptrace auto config: Using C++23 <stacktrace> for the full trace")
|
message(STATUS "Cpptrace auto config: Using C++23 <stacktrace> for the full trace")
|
||||||
elseif(HAS_BACKTRACE)
|
elseif(HAS_BACKTRACE)
|
||||||
|
|||||||
@ -32,13 +32,13 @@ export information which may require `-rdynamic` or manually marking symbols for
|
|||||||
namespace cpptrace {
|
namespace cpptrace {
|
||||||
struct stacktrace_frame {
|
struct stacktrace_frame {
|
||||||
uintptr_t address;
|
uintptr_t address;
|
||||||
int line;
|
std::uint_least32_t line;
|
||||||
int col;
|
std::uint_least32_t col;
|
||||||
std::string filename;
|
std::string filename;
|
||||||
std::string symbol;
|
std::string symbol;
|
||||||
};
|
};
|
||||||
std::vector<stacktrace_frame> generate_trace();
|
std::vector<stacktrace_frame> generate_trace(std::uint32_t skip = 0);
|
||||||
void print_trace();
|
void print_trace(std::uint32_t skip = 0);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -2,19 +2,20 @@
|
|||||||
#define CPPTRACE_HPP
|
#define CPPTRACE_HPP
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace cpptrace {
|
namespace cpptrace {
|
||||||
struct stacktrace_frame {
|
struct stacktrace_frame {
|
||||||
uintptr_t address;
|
uintptr_t address;
|
||||||
int line;
|
std::uint_least32_t line;
|
||||||
int col;
|
std::uint_least32_t col;
|
||||||
std::string filename;
|
std::string filename;
|
||||||
std::string symbol;
|
std::string symbol;
|
||||||
};
|
};
|
||||||
std::vector<stacktrace_frame> generate_trace();
|
std::vector<stacktrace_frame> generate_trace(std::uint32_t skip = 0);
|
||||||
void print_trace();
|
void print_trace(std::uint32_t skip = 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -14,8 +14,8 @@
|
|||||||
|
|
||||||
namespace cpptrace {
|
namespace cpptrace {
|
||||||
CPPTRACE_FORCE_NO_INLINE
|
CPPTRACE_FORCE_NO_INLINE
|
||||||
std::vector<stacktrace_frame> generate_trace() {
|
std::vector<stacktrace_frame> generate_trace(std::uint32_t skip) {
|
||||||
std::vector<void*> frames = detail::capture_frames(1);
|
std::vector<void*> frames = detail::capture_frames(skip + 1);
|
||||||
detail::symbolizer symbolizer;
|
detail::symbolizer symbolizer;
|
||||||
std::vector<stacktrace_frame> trace = symbolizer.resolve_frames(frames);
|
std::vector<stacktrace_frame> trace = symbolizer.resolve_frames(frames);
|
||||||
for(auto& frame : trace) {
|
for(auto& frame : trace) {
|
||||||
@ -34,8 +34,8 @@ namespace cpptrace {
|
|||||||
|
|
||||||
namespace cpptrace {
|
namespace cpptrace {
|
||||||
CPPTRACE_FORCE_NO_INLINE
|
CPPTRACE_FORCE_NO_INLINE
|
||||||
std::vector<stacktrace_frame> generate_trace() {
|
std::vector<stacktrace_frame> generate_trace(std::uint32_t skip) {
|
||||||
auto trace = detail::generate_trace(1);
|
auto trace = detail::generate_trace(skip + 1);
|
||||||
for(auto& entry : trace) {
|
for(auto& entry : trace) {
|
||||||
entry.symbol = detail::demangle(entry.symbol);
|
entry.symbol = detail::demangle(entry.symbol);
|
||||||
}
|
}
|
||||||
@ -46,10 +46,10 @@ namespace cpptrace {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace cpptrace {
|
namespace cpptrace {
|
||||||
void print_trace() {
|
void print_trace(std::uint32_t skip) {
|
||||||
std::cerr<<"Stack trace (most recent call first):"<<std::endl;
|
std::cerr<<"Stack trace (most recent call first):"<<std::endl;
|
||||||
std::size_t i = 0;
|
std::size_t i = 0;
|
||||||
const auto trace = generate_trace();
|
const auto trace = generate_trace(skip + 1);
|
||||||
// +1 to skip one frame
|
// +1 to skip one frame
|
||||||
for(auto it = trace.begin() + 1; it != trace.end(); it++) {
|
for(auto it = trace.begin() + 1; it != trace.end(); it++) {
|
||||||
const auto& frame = *it;
|
const auto& frame = *it;
|
||||||
|
|||||||
@ -27,8 +27,8 @@ namespace cpptrace {
|
|||||||
} else {
|
} else {
|
||||||
data.frames.push_back({
|
data.frames.push_back({
|
||||||
address,
|
address,
|
||||||
line,
|
static_cast<std::uint_least32_t>(line),
|
||||||
-1,
|
0,
|
||||||
file ? file : "",
|
file ? file : "",
|
||||||
symbol ? symbol : ""
|
symbol ? symbol : ""
|
||||||
});
|
});
|
||||||
|
|||||||
@ -17,7 +17,7 @@ namespace cpptrace {
|
|||||||
frames.push_back({
|
frames.push_back({
|
||||||
entry.native_handle(),
|
entry.native_handle(),
|
||||||
entry.source_line(),
|
entry.source_line(),
|
||||||
-1,
|
0,
|
||||||
entry.source_file(),
|
entry.source_file(),
|
||||||
entry.description()
|
entry.description()
|
||||||
});
|
});
|
||||||
|
|||||||
@ -339,8 +339,8 @@ namespace cpptrace {
|
|||||||
fprintf(stderr, "Stack trace: Internal error while calling SymSetContext\n");
|
fprintf(stderr, "Stack trace: Internal error while calling SymSetContext\n");
|
||||||
return {
|
return {
|
||||||
reinterpret_cast<uintptr_t>(addr),
|
reinterpret_cast<uintptr_t>(addr),
|
||||||
int(line.LineNumber),
|
static_cast<std::uint_least32_t>(line.LineNumber),
|
||||||
-1,
|
0,
|
||||||
line.FileName,
|
line.FileName,
|
||||||
symbol->Name
|
symbol->Name
|
||||||
};
|
};
|
||||||
@ -363,16 +363,16 @@ namespace cpptrace {
|
|||||||
signature = std::regex_replace(signature, comma_re, ", ");
|
signature = std::regex_replace(signature, comma_re, ", ");
|
||||||
return {
|
return {
|
||||||
reinterpret_cast<uintptr_t>(addr),
|
reinterpret_cast<uintptr_t>(addr),
|
||||||
int(line.LineNumber),
|
static_cast<std::uint_least32_t>(line.LineNumber),
|
||||||
-1,
|
0,
|
||||||
line.FileName,
|
line.FileName,
|
||||||
signature
|
signature
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
reinterpret_cast<uintptr_t>(addr),
|
reinterpret_cast<uintptr_t>(addr),
|
||||||
-1,
|
0,
|
||||||
-1,
|
0,
|
||||||
"",
|
"",
|
||||||
symbol->Name
|
symbol->Name
|
||||||
};
|
};
|
||||||
@ -380,8 +380,8 @@ namespace cpptrace {
|
|||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
reinterpret_cast<uintptr_t>(addr),
|
reinterpret_cast<uintptr_t>(addr),
|
||||||
-1,
|
0,
|
||||||
-1,
|
0,
|
||||||
"",
|
"",
|
||||||
""
|
""
|
||||||
};
|
};
|
||||||
|
|||||||
@ -55,7 +55,7 @@ namespace cpptrace {
|
|||||||
struct symbolizer::impl {
|
struct symbolizer::impl {
|
||||||
stacktrace_frame resolve_frame(void* addr) {
|
stacktrace_frame resolve_frame(void* addr) {
|
||||||
stacktrace_frame frame;
|
stacktrace_frame frame;
|
||||||
frame.col = -1;
|
frame.col = 0;
|
||||||
backtrace_pcinfo(
|
backtrace_pcinfo(
|
||||||
get_backtrace_state(),
|
get_backtrace_state(),
|
||||||
reinterpret_cast<uintptr_t>(addr),
|
reinterpret_cast<uintptr_t>(addr),
|
||||||
|
|||||||
@ -14,8 +14,8 @@ namespace cpptrace {
|
|||||||
// stacktrace_frame symbolizer::resolve_frame(void*) {
|
// stacktrace_frame symbolizer::resolve_frame(void*) {
|
||||||
// return {
|
// return {
|
||||||
// 0,
|
// 0,
|
||||||
// -1,
|
// 0,
|
||||||
// -1,
|
// 0,
|
||||||
// "",
|
// "",
|
||||||
// "",
|
// "",
|
||||||
// };
|
// };
|
||||||
@ -24,8 +24,8 @@ namespace cpptrace {
|
|||||||
std::vector<stacktrace_frame> symbolizer::resolve_frames(const std::vector<void*>& frames) {
|
std::vector<stacktrace_frame> symbolizer::resolve_frames(const std::vector<void*>& frames) {
|
||||||
return std::vector<stacktrace_frame>(frames.size(), {
|
return std::vector<stacktrace_frame>(frames.size(), {
|
||||||
0,
|
0,
|
||||||
-1,
|
0,
|
||||||
-1,
|
0,
|
||||||
"",
|
"",
|
||||||
""
|
""
|
||||||
});
|
});
|
||||||
|
|||||||
@ -26,5 +26,5 @@ D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl||79||invoke_
|
|||||||
D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl||288||__scrt_common_main_seh()
|
D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl||288||__scrt_common_main_seh()
|
||||||
D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl||331||__scrt_common_main()
|
D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl||331||__scrt_common_main()
|
||||||
D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp||17||mainCRTStartup(void*)
|
D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp||17||mainCRTStartup(void*)
|
||||||
||-1||BaseThreadInitThunk
|
||0||BaseThreadInitThunk
|
||||||
||-1||RtlUserThreadStart
|
||0||RtlUserThreadStart
|
||||||
Loading…
Reference in New Issue
Block a user