diff --git a/CMakeLists.txt b/CMakeLists.txt index cc1e4cd..557ec0b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -121,7 +121,7 @@ if( ) ) # Attempt to auto-config - if(HAS_STACKTRACE AND NOT WIN32) + if(HAS_STACKTRACE AND NOT WIN32) # Our trace is better than msvc's set(CPPTRACE_FULL_TRACE_WITH_LIBBACKTRACE On) message(STATUS "Cpptrace auto config: Using C++23 for the full trace") elseif(HAS_BACKTRACE) diff --git a/README.md b/README.md index b838d2a..88b8a39 100644 --- a/README.md +++ b/README.md @@ -32,13 +32,13 @@ export information which may require `-rdynamic` or manually marking symbols for namespace cpptrace { struct stacktrace_frame { uintptr_t address; - int line; - int col; + std::uint_least32_t line; + std::uint_least32_t col; std::string filename; std::string symbol; }; - std::vector generate_trace(); - void print_trace(); + std::vector generate_trace(std::uint32_t skip = 0); + void print_trace(std::uint32_t skip = 0); } ``` diff --git a/include/cpptrace/cpptrace.hpp b/include/cpptrace/cpptrace.hpp index 95fc57c..a87b919 100644 --- a/include/cpptrace/cpptrace.hpp +++ b/include/cpptrace/cpptrace.hpp @@ -2,19 +2,20 @@ #define CPPTRACE_HPP #include +#include #include #include namespace cpptrace { struct stacktrace_frame { uintptr_t address; - int line; - int col; + std::uint_least32_t line; + std::uint_least32_t col; std::string filename; std::string symbol; }; - std::vector generate_trace(); - void print_trace(); + std::vector generate_trace(std::uint32_t skip = 0); + void print_trace(std::uint32_t skip = 0); } #endif diff --git a/src/cpptrace.cpp b/src/cpptrace.cpp index c3631e6..6435d30 100644 --- a/src/cpptrace.cpp +++ b/src/cpptrace.cpp @@ -14,8 +14,8 @@ namespace cpptrace { CPPTRACE_FORCE_NO_INLINE - std::vector generate_trace() { - std::vector frames = detail::capture_frames(1); + std::vector generate_trace(std::uint32_t skip) { + std::vector frames = detail::capture_frames(skip + 1); detail::symbolizer symbolizer; std::vector trace = symbolizer.resolve_frames(frames); for(auto& frame : trace) { @@ -34,8 +34,8 @@ namespace cpptrace { namespace cpptrace { CPPTRACE_FORCE_NO_INLINE - std::vector generate_trace() { - auto trace = detail::generate_trace(1); + std::vector generate_trace(std::uint32_t skip) { + auto trace = detail::generate_trace(skip + 1); for(auto& entry : trace) { entry.symbol = detail::demangle(entry.symbol); } @@ -46,10 +46,10 @@ namespace cpptrace { #endif namespace cpptrace { - void print_trace() { + void print_trace(std::uint32_t skip) { std::cerr<<"Stack trace (most recent call first):"<(line), + 0, file ? file : "", symbol ? symbol : "" }); diff --git a/src/full/full_trace_with_stacktrace.cpp b/src/full/full_trace_with_stacktrace.cpp index fc18775..49f952e 100644 --- a/src/full/full_trace_with_stacktrace.cpp +++ b/src/full/full_trace_with_stacktrace.cpp @@ -17,7 +17,7 @@ namespace cpptrace { frames.push_back({ entry.native_handle(), entry.source_line(), - -1, + 0, entry.source_file(), entry.description() }); diff --git a/src/platform/cpptrace_common.hpp b/src/platform/cpptrace_common.hpp index 9e63746..b966dbe 100644 --- a/src/platform/cpptrace_common.hpp +++ b/src/platform/cpptrace_common.hpp @@ -98,7 +98,7 @@ static std::string join(const C& container, const std::string& delim) { return str; } -constexpr const char * const ws = " \t\n\r\f\v"; +constexpr const char* const ws = " \t\n\r\f\v"; CPPTRACE_MAYBE_UNUSED static std::string trim(const std::string& s) { diff --git a/src/symbols/symbols_with_dbghelp.cpp b/src/symbols/symbols_with_dbghelp.cpp index b1bea71..5b8bf0f 100644 --- a/src/symbols/symbols_with_dbghelp.cpp +++ b/src/symbols/symbols_with_dbghelp.cpp @@ -339,8 +339,8 @@ namespace cpptrace { fprintf(stderr, "Stack trace: Internal error while calling SymSetContext\n"); return { reinterpret_cast(addr), - int(line.LineNumber), - -1, + static_cast(line.LineNumber), + 0, line.FileName, symbol->Name }; @@ -363,16 +363,16 @@ namespace cpptrace { signature = std::regex_replace(signature, comma_re, ", "); return { reinterpret_cast(addr), - int(line.LineNumber), - -1, + static_cast(line.LineNumber), + 0, line.FileName, signature }; } else { return { reinterpret_cast(addr), - -1, - -1, + 0, + 0, "", symbol->Name }; @@ -380,8 +380,8 @@ namespace cpptrace { } else { return { reinterpret_cast(addr), - -1, - -1, + 0, + 0, "", "" }; diff --git a/src/symbols/symbols_with_libbacktrace.cpp b/src/symbols/symbols_with_libbacktrace.cpp index 6a6c4ea..18c999c 100644 --- a/src/symbols/symbols_with_libbacktrace.cpp +++ b/src/symbols/symbols_with_libbacktrace.cpp @@ -55,7 +55,7 @@ namespace cpptrace { struct symbolizer::impl { stacktrace_frame resolve_frame(void* addr) { stacktrace_frame frame; - frame.col = -1; + frame.col = 0; backtrace_pcinfo( get_backtrace_state(), reinterpret_cast(addr), diff --git a/src/symbols/symbols_with_nothing.cpp b/src/symbols/symbols_with_nothing.cpp index c95b798..3e3c08b 100644 --- a/src/symbols/symbols_with_nothing.cpp +++ b/src/symbols/symbols_with_nothing.cpp @@ -14,8 +14,8 @@ namespace cpptrace { // stacktrace_frame symbolizer::resolve_frame(void*) { // return { // 0, - // -1, - // -1, + // 0, + // 0, // "", // "", // }; @@ -24,8 +24,8 @@ namespace cpptrace { std::vector symbolizer::resolve_frames(const std::vector& frames) { return std::vector(frames.size(), { 0, - -1, - -1, + 0, + 0, "", "" }); diff --git a/test/expected/windows.txt b/test/expected/windows.txt index bf338e0..2d661b6 100644 --- a/test/expected/windows.txt +++ b/test/expected/windows.txt @@ -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||331||__scrt_common_main() D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp||17||mainCRTStartup(void*) -||-1||BaseThreadInitThunk -||-1||RtlUserThreadStart \ No newline at end of file +||0||BaseThreadInitThunk +||0||RtlUserThreadStart \ No newline at end of file