diff --git a/alib2common/src/debug/simpleStacktrace.cpp b/alib2common/src/debug/simpleStacktrace.cpp index bb59178c870d965596837112f1d22ed1eb7b37b6..91dbfa24b2449871c4dfbf5319700031bb1f38a0 100644 --- a/alib2common/src/debug/simpleStacktrace.cpp +++ b/alib2common/src/debug/simpleStacktrace.cpp @@ -11,9 +11,10 @@ #include <link.h> #include <cstring> -#include <sstream> +#include <ext/sstream> #include <string> #include <map> +#include <filesystem> namespace ext { @@ -26,25 +27,15 @@ int callback(struct dl_phdr_info *info, size_t, void * data) { } #if defined DEBUG && defined BACKTRACE - void simpleStacktrace ( ext::ostream & out, unsigned int max_frames ) { - char linkname[512]; /* /proc/exe */ - char buf[512]; - pid_t pid; - int ret; - + void simpleStacktrace ( ext::ostream & out, int max_frames ) { /* Get our PID and build the name of the link in /proc */ - pid = getpid(); - snprintf(linkname, sizeof(linkname), "/proc/%i/exe", pid); + pid_t pid = getpid(); + auto linkname = std::filesystem::path("/proc") / std::to_string(pid) / "exe"; /* Now read the symbolic link */ - ret = readlink(linkname, buf, 512); - if ( ret < 0 ) { - strcpy(buf, "[UNKNOWN]"); - } else { - buf[ret] = 0; - } + std::filesystem::path procname = std::filesystem::read_symlink ( linkname ); - out << "stack trace for process " << buf << " (PID:" << pid << "):"<< std::endl; + out << "stack trace for process " << procname << " (PID:" << pid << "):" << std::endl; // storage array for stack trace address data void** addrlist = static_cast < void * * > ( malloc ( ( max_frames + 1 ) * sizeof ( * addrlist ) ) ); @@ -63,8 +54,8 @@ int callback(struct dl_phdr_info *info, size_t, void * data) { char** symbollist = backtrace_symbols(addrlist, addrlen); // allocate string which will be filled with the demangled function name - size_t funcnamesize = 256; - char* funcname = static_cast < char * > ( malloc ( funcnamesize * sizeof ( * funcname ) ) ); + size_t funcnamesize = 0; + char* funcname = nullptr; std::map<std::string, long> dlToBaseAddress; @@ -73,7 +64,10 @@ int callback(struct dl_phdr_info *info, size_t, void * data) { // iterate over the returned symbol lines. skip the first, it is the // address of this function. for (int i = 1; i < addrlen; ++i) { - char *begin_name = 0, *begin_offset = 0, *end_offset = 0, *addr_offset = 0; + char *begin_name = 0; + char *begin_offset = 0; + char *end_offset = 0; + char *addr_offset = 0; // find parentheses and +address offset surrounding the mangled name: // module(function+0x15c) [0x8048a6d] @@ -114,7 +108,7 @@ int callback(struct dl_phdr_info *info, size_t, void * data) { // __cxa_demangle(): int status; - char* demangled = abi::__cxa_demangle(begin_name, funcname, &funcnamesize, &status); + char* demangled = abi::__cxa_demangle(begin_name, nullptr, &funcnamesize, &status); if (status == 0) { funcname = demangled; // use possibly realloc()-ed string out << " " << symbollist[i] << " : " << funcname << "+" << begin_offset << " " << begin_name << " [0x" << addr_offset_by_dl.c_str() << "; @ " << addr_offset << "]" << std::endl; @@ -133,7 +127,7 @@ int callback(struct dl_phdr_info *info, size_t, void * data) { free(addrlist); } #else - void simpleStacktrace ( std::ostream &, unsigned int ) { + void simpleStacktrace ( std::ostream &, int ) { } #endif diff --git a/alib2common/src/debug/simpleStacktrace.h b/alib2common/src/debug/simpleStacktrace.h index ac613c73c397a4c168cc1e7f9cce661585c9c6fd..9d84e9552dc6d9f8db05751b9972e9cefb05f9c0 100644 --- a/alib2common/src/debug/simpleStacktrace.h +++ b/alib2common/src/debug/simpleStacktrace.h @@ -11,7 +11,8 @@ namespace ext { * \brief * Analyzes the backtrace (stack trace) and creates its sring representation, one function call per line. */ -void simpleStacktrace ( ext::ostream & out, unsigned int max_frames = 1000); + +void simpleStacktrace ( ext::ostream & out, int max_frames = 1000); // NOLINT(readability-magic-numbers) } /* namespace ext */