Extract util methods

This commit is contained in:
Christophe Bedard 2019-06-04 16:37:11 +02:00
parent 51f3c16205
commit ee813caaf1
5 changed files with 52 additions and 20 deletions

View file

@ -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})

View file

@ -158,7 +158,7 @@ void TRACEPOINT(
void TRACEPOINT(
rclcpp_callback_register,
const void * callback,
const void * function_target);
const char * function_symbol);
#ifdef __cplusplus
}

View file

@ -0,0 +1,19 @@
#ifndef __TRACETOOLS_UTILS_H_
#define __TRACETOOLS_UTILS_H_
#include <stddef.h>
template<typename T, typename... U>
size_t get_address(std::function<T(U...)> f) {
typedef T(fnType)(U...);
fnType ** fnPointer = f.template target<fnType*>();
// Might be a lambda
if (fnPointer == nullptr) {
return 0;
}
return (size_t)*fnPointer;
}
const char * get_symbol(void * funptr);
#endif /* __TRACETOOLS_UTILS_H_ */

View file

@ -1,4 +1,3 @@
#include <execinfo.h>
#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);
}

28
tracetools/src/utils.cpp Normal file
View file

@ -0,0 +1,28 @@
#if defined(WITH_LTTNG) && !defined(_WIN32)
#include <dlfcn.h>
#include <cxxabi.h>
#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
}