From f4d874c2f64740032b98406c056ca5fe744089cc Mon Sep 17 00:00:00 2001 From: marcin-ol Date: Thu, 27 Oct 2022 00:05:57 +0200 Subject: [PATCH] Convert frame name format to 'function (DSO)' for LIB style (#2) For https://github.com/Granulate/gprofiler/pull/491 --- src/codeCache.cpp | 8 +++++++- src/codeCache.h | 1 + src/frameName.cpp | 4 ++-- src/profiler.cpp | 16 ++++++++++++---- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/codeCache.cpp b/src/codeCache.cpp index 3465b9036..9e00accbd 100644 --- a/src/codeCache.cpp +++ b/src/codeCache.cpp @@ -41,6 +41,10 @@ size_t NativeFunc::usedMemory(const char* name) { CodeCache::CodeCache(const char* name, short lib_index, const void* min_address, const void* max_address) { _name = NativeFunc::create(name, -1); + char *tmp = (char*)malloc(strlen(name) + 3); + snprintf(tmp, strlen(name) + 3, "(%s)", name); + _lib_symbol = NativeFunc::create(tmp, -1); + free(tmp); _lib_index = lib_index; _min_address = min_address; _max_address = max_address; @@ -63,6 +67,7 @@ CodeCache::~CodeCache() { for (int i = 0; i < _count; i++) { NativeFunc::destroy(_blobs[i]._name); } + NativeFunc::destroy(_lib_symbol); NativeFunc::destroy(_name); delete[] _blobs; free(_dwarf_table); @@ -153,7 +158,8 @@ const char* CodeCache::binarySearch(const void* address) { if (low > 0 && (_blobs[low - 1]._start == _blobs[low - 1]._end || _blobs[low - 1]._end == address)) { return _blobs[low - 1]._name; } - return _name; + + return _lib_symbol; } const void* CodeCache::findSymbol(const char* name) { diff --git a/src/codeCache.h b/src/codeCache.h index 18a6cbf41..f4192c9cd 100644 --- a/src/codeCache.h +++ b/src/codeCache.h @@ -87,6 +87,7 @@ class FrameDesc; class CodeCache { protected: char* _name; + char* _lib_symbol; short _lib_index; const void* _min_address; const void* _max_address; diff --git a/src/frameName.cpp b/src/frameName.cpp index afd86a229..e6f0ca5b0 100644 --- a/src/frameName.cpp +++ b/src/frameName.cpp @@ -134,7 +134,7 @@ const char* FrameName::decodeNativeSymbol(const char* name) { char* demangled = abi::__cxa_demangle(name, NULL, NULL, &status); if (demangled != NULL) { if (lib_name != NULL) { - _str.assign(lib_name).append("`").append(demangled); + _str.assign(demangled).append(" (").append(lib_name).append(")"); } else { _str.assign(demangled); } @@ -144,7 +144,7 @@ const char* FrameName::decodeNativeSymbol(const char* name) { } if (lib_name != NULL) { - return _str.assign(lib_name).append("`").append(name).c_str(); + return _str.assign(name).append(" (").append(lib_name).append(")").c_str(); } else { return name; } diff --git a/src/profiler.cpp b/src/profiler.cpp index dda257e28..64ef8e8c1 100644 --- a/src/profiler.cpp +++ b/src/profiler.cpp @@ -245,8 +245,7 @@ const char* Profiler::getLibraryName(const char* native_symbol) { if (lib_index >= 0 && lib_index < _native_libs.count()) { const char* s = _native_libs[lib_index]->name(); if (s != NULL) { - const char* p = strrchr(s, '/'); - return p != NULL ? p + 1 : s; + return s; } } return NULL; @@ -259,15 +258,24 @@ CodeCache* Profiler::findJvmLibrary(const char* lib_name) { CodeCache* Profiler::findLibraryByName(const char* lib_name) { const size_t lib_name_len = strlen(lib_name); const int native_lib_count = _native_libs.count(); + int basename_match_i = -1; for (int i = 0; i < native_lib_count; i++) { const char* s = _native_libs[i]->name(); if (s != NULL) { - const char* p = strrchr(s, '/'); - if (p != NULL && strncmp(p + 1, lib_name, lib_name_len) == 0) { + if (strncmp(s, lib_name, lib_name_len) == 0) { return _native_libs[i]; } + if (basename_match_i < 0) { + const char* p = strrchr(s, '/'); + if (p != NULL && strncmp(p + 1, lib_name, lib_name_len) == 0) { + basename_match_i = i; + } + } } } + if (basename_match_i >= 0) { + return _native_libs[basename_match_i]; + } return NULL; }