From ee813caaf1b2dc7a2f86bc4a138a481b0582d70d Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Tue, 4 Jun 2019 16:37:11 +0200 Subject: [PATCH] Extract util methods --- tracetools/CMakeLists.txt | 2 ++ tracetools/include/tracetools/tracetools.h | 2 +- tracetools/include/tracetools/utils.hpp | 19 +++++++++++++++ tracetools/src/tracetools.c | 21 ++-------------- tracetools/src/utils.cpp | 28 ++++++++++++++++++++++ 5 files changed, 52 insertions(+), 20 deletions(-) create mode 100644 tracetools/include/tracetools/utils.hpp create mode 100644 tracetools/src/utils.cpp diff --git a/tracetools/CMakeLists.txt b/tracetools/CMakeLists.txt index f989644..cc9f735 100644 --- a/tracetools/CMakeLists.txt +++ b/tracetools/CMakeLists.txt @@ -42,6 +42,7 @@ include_directories(include) add_executable(${PROJECT_NAME}_status src/status.c src/tracetools.c + src/utils.cpp ) target_link_libraries(${PROJECT_NAME}_status ${PROJECT_NAME} @@ -57,6 +58,7 @@ install(TARGETS # Tracetools lib set(SOURCES src/tracetools.c + src/utils.cpp ) if(TRACING_ENABLED) list(APPEND SOURCES ${LTTNG_GENERATED}) diff --git a/tracetools/include/tracetools/tracetools.h b/tracetools/include/tracetools/tracetools.h index d00d4dd..944e6ce 100644 --- a/tracetools/include/tracetools/tracetools.h +++ b/tracetools/include/tracetools/tracetools.h @@ -158,7 +158,7 @@ void TRACEPOINT( void TRACEPOINT( rclcpp_callback_register, const void * callback, - const void * function_target); + const char * function_symbol); #ifdef __cplusplus } diff --git a/tracetools/include/tracetools/utils.hpp b/tracetools/include/tracetools/utils.hpp new file mode 100644 index 0000000..70a06e0 --- /dev/null +++ b/tracetools/include/tracetools/utils.hpp @@ -0,0 +1,19 @@ +#ifndef __TRACETOOLS_UTILS_H_ +#define __TRACETOOLS_UTILS_H_ + +#include + +template +size_t get_address(std::function f) { + typedef T(fnType)(U...); + fnType ** fnPointer = f.template target(); + // Might be a lambda + if (fnPointer == nullptr) { + return 0; + } + return (size_t)*fnPointer; +} + +const char * get_symbol(void * funptr); + +#endif /* __TRACETOOLS_UTILS_H_ */ diff --git a/tracetools/src/tracetools.c b/tracetools/src/tracetools.c index b27f290..1915333 100644 --- a/tracetools/src/tracetools.c +++ b/tracetools/src/tracetools.c @@ -1,4 +1,3 @@ -#include #include "tracetools/tracetools.h" #if defined(WITH_LTTNG) && !defined(_WIN32) @@ -9,22 +8,6 @@ # define CONDITIONAL_TP(...) #endif - -const char * get_symbol(const void * function_ptr) { -#if defined(WITH_LTTNG) && !defined(_WIN32) - // If it's actually a lambda - if (NULL == function_ptr) { - return ""; - } - char ** symbols = backtrace_symbols(&function_ptr, 1); - const char * result = symbols[0]; - free(symbols); - return result; -#else - return ""; -#endif -} - bool ros_trace_compile_status() { #if defined(WITH_LTTNG) && !defined(_WIN32) @@ -171,7 +154,7 @@ void TRACEPOINT( void TRACEPOINT( rclcpp_callback_register, const void * callback, - const void * function_target) + const char * function_symbol) { - CONDITIONAL_TP(ros2, rclcpp_callback_register, callback, get_symbol(function_target)); + CONDITIONAL_TP(ros2, rclcpp_callback_register, callback, function_symbol); } diff --git a/tracetools/src/utils.cpp b/tracetools/src/utils.cpp new file mode 100644 index 0000000..56396de --- /dev/null +++ b/tracetools/src/utils.cpp @@ -0,0 +1,28 @@ +#if defined(WITH_LTTNG) && !defined(_WIN32) +#include +#include +#endif + +const char * get_symbol(void * funptr) { +#define SYMBOL_UNKNOWN "UNKNOWN" +#if defined(WITH_LTTNG) && !defined(_WIN32) +#define SYMBOL_LAMBDA "[lambda]" + if (funptr == 0) { + return SYMBOL_LAMBDA; + } + + Dl_info info; + if (dladdr(funptr, &info) == 0) { + return SYMBOL_UNKNOWN; + } + + char * demangled = nullptr; + int status; + demangled = abi::__cxa_demangle(info.dli_sname, NULL, 0, &status); + // Use demangled symbol if possible + const char * demangled_val = (status == 0 ? demangled : info.dli_sname); + return (demangled_val != 0 ? demangled_val : SYMBOL_UNKNOWN); +#else + return SYMBOL_UNKNOWN; +#endif +}