From a467392cbd8a2b59ce6ac841d52d33df1b0cc31f Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Fri, 21 Jan 2022 17:22:41 -0800 Subject: [PATCH] [wpiutil] StackTrace: Add ability to override default implementation (#3951) --- wpiutil/src/main/native/cpp/StackTraceWrap.cpp | 18 ++++++++++++++++++ .../src/main/native/include/wpi/StackTrace.h | 14 ++++++++++++++ wpiutil/src/main/native/unix/StackTrace.cpp | 2 +- wpiutil/src/main/native/windows/StackTrace.cpp | 2 +- 4 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 wpiutil/src/main/native/cpp/StackTraceWrap.cpp diff --git a/wpiutil/src/main/native/cpp/StackTraceWrap.cpp b/wpiutil/src/main/native/cpp/StackTraceWrap.cpp new file mode 100644 index 0000000000..37a83f7ef0 --- /dev/null +++ b/wpiutil/src/main/native/cpp/StackTraceWrap.cpp @@ -0,0 +1,18 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +#include + +#include "wpi/StackTrace.h" + +static std::atomic gStackTraceImpl{ + wpi::GetStackTraceDefault}; + +std::string wpi::GetStackTrace(int offset) { + return (gStackTraceImpl.load())(offset); +} + +void wpi::SetGetStackTraceImpl(std::string (*func)(int offset)) { + gStackTraceImpl = func ? func : wpi::GetStackTraceDefault; +} diff --git a/wpiutil/src/main/native/include/wpi/StackTrace.h b/wpiutil/src/main/native/include/wpi/StackTrace.h index f9ee989d41..44e0b21d7b 100644 --- a/wpiutil/src/main/native/include/wpi/StackTrace.h +++ b/wpiutil/src/main/native/include/wpi/StackTrace.h @@ -16,6 +16,20 @@ namespace wpi { */ std::string GetStackTrace(int offset); +/** + * The default implementation used for GetStackTrace(). + * + * @param offset The number of symbols at the top of the stack to ignore + */ +std::string GetStackTraceDefault(int offset); + +/** + * Set the implementation used by GetStackTrace(). + * + * @param func Function called by GetStackTrace(). + */ +void SetGetStackTraceImpl(std::string (*func)(int offset)); + } // namespace wpi #endif // WPIUTIL_WPI_STACKTRACE_H_ diff --git a/wpiutil/src/main/native/unix/StackTrace.cpp b/wpiutil/src/main/native/unix/StackTrace.cpp index 598c9da099..3b6606533b 100644 --- a/wpiutil/src/main/native/unix/StackTrace.cpp +++ b/wpiutil/src/main/native/unix/StackTrace.cpp @@ -13,7 +13,7 @@ namespace wpi { -std::string GetStackTrace(int offset) { +std::string GetStackTraceDefault(int offset) { void* stackTrace[128]; int stackSize = backtrace(stackTrace, 128); char** mangledSymbols = backtrace_symbols(stackTrace, stackSize); diff --git a/wpiutil/src/main/native/windows/StackTrace.cpp b/wpiutil/src/main/native/windows/StackTrace.cpp index 3e3ccfaeb8..bab5f83511 100644 --- a/wpiutil/src/main/native/windows/StackTrace.cpp +++ b/wpiutil/src/main/native/windows/StackTrace.cpp @@ -32,7 +32,7 @@ void StackTraceWalker::OnOutput(LPCTSTR szText) { namespace wpi { -std::string GetStackTrace(int offset) { +std::string GetStackTraceDefault(int offset) { // TODO: implement offset std::string output; StackTraceWalker walker(output);