From a0b605b8e18aceb23a645b9534a271017f248f47 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 16:00:36 +0300 Subject: [PATCH 01/55] boost-stacktrace: Stacktrace.cpp (+6) [37+/15-] - impl --- CMakeLists.txt | 4 ++++ Libs/Boost/Stacktrace.cpp | 25 ++++++++++++++++++------- OS/Unix/Backtrace_2.sh | 2 +- OS/Unix/Backtrace_libunwind.cpp | 2 +- Stl/String/CstrNull.cpp | 6 +++--- Stl/String/StringWithNull.cpp | 13 ++++++++++--- 6 files changed, 37 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index edd5bf6..e47be1f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,6 +82,10 @@ foreach(IT_SOURCE ${SOURCES}) # libevent::libevent # openssl::openssl # ZLIB::ZLIB + backtrace + ssh2 + unwind + event ) # Targets - Build, run single test diff --git a/Libs/Boost/Stacktrace.cpp b/Libs/Boost/Stacktrace.cpp index 1918bdc..5026434 100644 --- a/Libs/Boost/Stacktrace.cpp +++ b/Libs/Boost/Stacktrace.cpp @@ -1,28 +1,39 @@ /** * \file Stacktrace.cpp * \brief boost::stacktrace + * + * g++ -DBOOST_STACKTRACE_USE_ADDR2LINE -ggdb -rdynamic Stacktrace.cpp -o bb -lboost_stacktrace_addr2line -ldl -O0 -fno-omit-frame-pointer -lboost_stacktrace_addr2line && ./bb */ #include #include -#include +// #include #if __has_include() #include #endif -#if (BOOST_VERSION > 0) - #define BOOST_STACKTRACE_USE_ADDR2LINE 1 +#if 1 || (BOOST_VERSION > 0) + // NOTE: BOOST_STACKTRACE_USE_ADDR2LINE - not working + #define BOOST_STACKTRACE_USE_BACKTRACE 1 #include #endif //------------------------------------------------------------------------------------------------- int main(int , char **) { -#if (BOOST_VERSION > 0) - const auto &aRv = boost::stacktrace::stacktrace(); - - std::cout << aRv.as_vector() << std::endl; +#if 1 || (BOOST_VERSION > 0) + const auto &stackTrace = boost::stacktrace::stacktrace(); + + for (const auto &it_frame : stackTrace.as_vector()) { + std::cout << + STD_TRACE_VAR(it_frame.name()) << "\n" + STD_TRACE_VAR(it_frame.address()) << "\n" + STD_TRACE_VAR(it_frame.source_file()) << "\n" + STD_TRACE_VAR(it_frame.source_line()) << std::endl; + + std::cout << STD_TRACE_VAR(it_frame) << '\n' << std::endl; + } // for (vars) #else std::cout << "Boost - not instaled, skip" << std::endl; #endif diff --git a/OS/Unix/Backtrace_2.sh b/OS/Unix/Backtrace_2.sh index f87d56d..e34a7b7 100755 --- a/OS/Unix/Backtrace_2.sh +++ b/OS/Unix/Backtrace_2.sh @@ -4,7 +4,7 @@ CPP_BASE_NAME="./Backtrace_2" echo "Compile ${CPP_BASE_NAME}.cpp ..." -c++ -g -O0 ./${CPP_BASE_NAME}.cpp -rdynamic -ldl -fpermissive -o ./${CPP_BASE_NAME}.exe +c++ -g -rdynamic ./${CPP_BASE_NAME}.cpp -ldl -O0 -fno-omit-frame-pointer -fpermissive -o ./${CPP_BASE_NAME}.exe echo "Run..." ./${CPP_BASE_NAME}.exe diff --git a/OS/Unix/Backtrace_libunwind.cpp b/OS/Unix/Backtrace_libunwind.cpp index 653a219..0433917 100644 --- a/OS/Unix/Backtrace_libunwind.cpp +++ b/OS/Unix/Backtrace_libunwind.cpp @@ -87,7 +87,7 @@ void funcA() } //-------------------------------------------------------------------------------------------------- int -main(int, char** argv) +main(int, char**) { funcA(); diff --git a/Stl/String/CstrNull.cpp b/Stl/String/CstrNull.cpp index 54aa580..edb9cdc 100644 --- a/Stl/String/CstrNull.cpp +++ b/Stl/String/CstrNull.cpp @@ -16,13 +16,13 @@ int main(int, char **) STD_TEST(ptr == nullptr); ptr = str.c_str(); - STD_TEST_PTR(ptr != nullptr); + STD_TEST_PTR(ptr); ptr = str.data(); - STD_TEST_PTR(ptr != nullptr); + STD_TEST_PTR(ptr); ptr = &str[0]; - STD_TEST_PTR(ptr != nullptr); + STD_TEST_PTR(ptr); STD_UNUSED(ptr); diff --git a/Stl/String/StringWithNull.cpp b/Stl/String/StringWithNull.cpp index 160345c..1232bc2 100644 --- a/Stl/String/StringWithNull.cpp +++ b/Stl/String/StringWithNull.cpp @@ -18,8 +18,7 @@ int main(int, char **) sFileName.push_back('y'); std::string sExceptedChars = "/\0"; - - // STD_TEST_PTR(sExceptedChars.size() == 2); - raise!!! + STD_TEST(sExceptedChars.size() == 1); size_t uiPos = sFileName.find_first_of(sExceptedChars); if (std::string::npos == uiPos) { @@ -28,6 +27,8 @@ int main(int, char **) std::cout << "Found" << std::endl; } + STD_TEST(std::string::npos == uiPos); + #if OUTPUT Not found #endif @@ -44,7 +45,7 @@ int main(int, char **) sExceptedChars.push_back('/'); sExceptedChars.push_back('\0'); - STD_TEST_PTR(sExceptedChars.size() == 2); + STD_TEST(sExceptedChars.size() == 2); size_t uiPos = sFileName.find_first_of(sExceptedChars); if (std::string::npos == uiPos) { @@ -53,6 +54,8 @@ int main(int, char **) std::cout << "Found" << std::endl; } + STD_TEST(std::string::npos != uiPos) + #if OUTPUT Found #endif @@ -74,6 +77,8 @@ int main(int, char **) std::cout << "Found" << std::endl; } + STD_TEST(std::string::npos == uiPos); + #if OUTPUT Not found #endif @@ -95,6 +100,8 @@ int main(int, char **) std::cout << "Found" << std::endl; } + STD_TEST(std::string::npos != uiPos); + #if OUTPUT Found #endif From effe6e1a32bf546c892a43530e54293c5a8e72bd Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 16:21:44 +0300 Subject: [PATCH 02/55] boost-stacktrace: Backtrace_2.sh [1+/1-] - impl --- OS/Unix/Backtrace_2.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OS/Unix/Backtrace_2.sh b/OS/Unix/Backtrace_2.sh index e34a7b7..b1f7a83 100755 --- a/OS/Unix/Backtrace_2.sh +++ b/OS/Unix/Backtrace_2.sh @@ -4,7 +4,7 @@ CPP_BASE_NAME="./Backtrace_2" echo "Compile ${CPP_BASE_NAME}.cpp ..." -c++ -g -rdynamic ./${CPP_BASE_NAME}.cpp -ldl -O0 -fno-omit-frame-pointer -fpermissive -o ./${CPP_BASE_NAME}.exe +c++ -g -O0 -rdynamic ./${CPP_BASE_NAME}.cpp -ldl -fno-omit-frame-pointer -fpermissive -o ./${CPP_BASE_NAME}.exe echo "Run..." ./${CPP_BASE_NAME}.exe From 651fe01acb358b421686cf14737a988aae936400 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 16:22:33 +0300 Subject: [PATCH 03/55] boost-stacktrace: Stacktrace.cpp [2+/2-] - impl --- Libs/Boost/Stacktrace.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Libs/Boost/Stacktrace.cpp b/Libs/Boost/Stacktrace.cpp index 5026434..2bc3bfb 100644 --- a/Libs/Boost/Stacktrace.cpp +++ b/Libs/Boost/Stacktrace.cpp @@ -14,7 +14,7 @@ #include #endif -#if 1 || (BOOST_VERSION > 0) +#if (BOOST_VERSION > 0) // NOTE: BOOST_STACKTRACE_USE_ADDR2LINE - not working #define BOOST_STACKTRACE_USE_BACKTRACE 1 #include @@ -22,7 +22,7 @@ //------------------------------------------------------------------------------------------------- int main(int , char **) { -#if 1 || (BOOST_VERSION > 0) +#if (BOOST_VERSION > 0) const auto &stackTrace = boost::stacktrace::stacktrace(); for (const auto &it_frame : stackTrace.as_vector()) { From 357117057085a6a66bffd8904b98d9fcd49659d4 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 16:23:23 +0300 Subject: [PATCH 04/55] boost-stacktrace: Stacktrace.cpp [1+/1-] - impl --- Libs/Boost/Stacktrace.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Libs/Boost/Stacktrace.cpp b/Libs/Boost/Stacktrace.cpp index 2bc3bfb..00eb81f 100644 --- a/Libs/Boost/Stacktrace.cpp +++ b/Libs/Boost/Stacktrace.cpp @@ -33,7 +33,7 @@ int main(int , char **) STD_TRACE_VAR(it_frame.source_line()) << std::endl; std::cout << STD_TRACE_VAR(it_frame) << '\n' << std::endl; - } // for (vars) + } #else std::cout << "Boost - not instaled, skip" << std::endl; #endif From c955baa3be10a40d348c78239192762e96143b3a Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 16:24:47 +0300 Subject: [PATCH 05/55] boost-stacktrace: Stacktrace.cpp [2+/2-] - impl --- Libs/Boost/Stacktrace.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Libs/Boost/Stacktrace.cpp b/Libs/Boost/Stacktrace.cpp index 00eb81f..447d273 100644 --- a/Libs/Boost/Stacktrace.cpp +++ b/Libs/Boost/Stacktrace.cpp @@ -26,13 +26,13 @@ int main(int , char **) const auto &stackTrace = boost::stacktrace::stacktrace(); for (const auto &it_frame : stackTrace.as_vector()) { + std::cout << STD_TRACE_VAR(it_frame) << '\n' << std::endl; + std::cout << STD_TRACE_VAR(it_frame.name()) << "\n" STD_TRACE_VAR(it_frame.address()) << "\n" STD_TRACE_VAR(it_frame.source_file()) << "\n" STD_TRACE_VAR(it_frame.source_line()) << std::endl; - - std::cout << STD_TRACE_VAR(it_frame) << '\n' << std::endl; } #else std::cout << "Boost - not instaled, skip" << std::endl; From a5dc1a80d881c234764c8e8c2a1f9ffa0e06917d Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 16:26:21 +0300 Subject: [PATCH 06/55] boost-stacktrace: Stacktrace.cpp [1+/1-] - impl --- Libs/Boost/Stacktrace.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Libs/Boost/Stacktrace.cpp b/Libs/Boost/Stacktrace.cpp index 447d273..036f6f4 100644 --- a/Libs/Boost/Stacktrace.cpp +++ b/Libs/Boost/Stacktrace.cpp @@ -8,7 +8,7 @@ #include #include -// #include +#include #if __has_include() #include From 4377c128a78a59e570afe91440846ef53182fd92 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 16:48:30 +0300 Subject: [PATCH 07/55] boost-stacktrace: Stacktrace.cpp [43+/11-] - impl --- Libs/Boost/Stacktrace.cpp | 54 +++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/Libs/Boost/Stacktrace.cpp b/Libs/Boost/Stacktrace.cpp index 036f6f4..2c56fbc 100644 --- a/Libs/Boost/Stacktrace.cpp +++ b/Libs/Boost/Stacktrace.cpp @@ -14,31 +14,63 @@ #include #endif -#if (BOOST_VERSION > 0) - // NOTE: BOOST_STACKTRACE_USE_ADDR2LINE - not working +#if 1 || (BOOST_VERSION > 0) + // NOTE: BOOST_STACKTRACE_USE_ADDR2LINE - not working #define BOOST_STACKTRACE_USE_BACKTRACE 1 #include #endif //------------------------------------------------------------------------------------------------- +std::string +executableName( + const boost::stacktrace::frame &a_frame +) +{ + // The first frame usually represents the main function or entry point + if ( a_frame.empty() ) { + return "Unknown executable"; // Fallback if unable to determine + } + + const auto addr = a_frame.address(); + if (addr == nullptr) { + return {}; + } + + Dl_info info {}; + if (::dladdr(addr, &info) == 0) { + return {}; + } + + if (info.dli_fname != nullptr) { + return {}; + } + + return info.dli_fname; +} +//------------------------------------------------------------------------------------------------- int main(int , char **) { -#if (BOOST_VERSION > 0) - const auto &stackTrace = boost::stacktrace::stacktrace(); +#if 1 || (BOOST_VERSION > 0) + const auto &stackTrace = boost::stacktrace::stacktrace(); for (const auto &it_frame : stackTrace.as_vector()) { - std::cout << STD_TRACE_VAR(it_frame) << '\n' << std::endl; + std::cout << "------------------------------" << std::endl; - std::cout << - STD_TRACE_VAR(it_frame.name()) << "\n" - STD_TRACE_VAR(it_frame.address()) << "\n" - STD_TRACE_VAR(it_frame.source_file()) << "\n" - STD_TRACE_VAR(it_frame.source_line()) << std::endl; + if (0) { + std::cout << STD_TRACE_VAR(it_frame) << '\n' << std::endl; + } else { + std::cout << + "module: " << ::executableName(it_frame) << "\n" + STD_TRACE_VAR(it_frame.name()) << "\n" + STD_TRACE_VAR(it_frame.address()) << "\n" + STD_TRACE_VAR(it_frame.source_file()) << "\n" + STD_TRACE_VAR(it_frame.source_line()) << std::endl; + } } #else std::cout << "Boost - not instaled, skip" << std::endl; #endif - return EXIT_SUCCESS; + return EXIT_SUCCESS; } //------------------------------------------------------------------------------------------------- From 33990c80e4c140b6cba772fb5df6c0a6f21a79d0 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 16:49:43 +0300 Subject: [PATCH 08/55] boost-stacktrace: Stacktrace.cpp [1+/1-] - impl --- Libs/Boost/Stacktrace.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Libs/Boost/Stacktrace.cpp b/Libs/Boost/Stacktrace.cpp index 2c56fbc..f4a7b97 100644 --- a/Libs/Boost/Stacktrace.cpp +++ b/Libs/Boost/Stacktrace.cpp @@ -40,7 +40,7 @@ executableName( return {}; } - if (info.dli_fname != nullptr) { + if (info.dli_fname == nullptr) { return {}; } From 730b8a053fae33b7bbc4e68311068eecbf88da3c Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 16:50:25 +0300 Subject: [PATCH 09/55] boost-stacktrace: Stacktrace.cpp [7+/6-] - impl --- Libs/Boost/Stacktrace.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Libs/Boost/Stacktrace.cpp b/Libs/Boost/Stacktrace.cpp index f4a7b97..474acd8 100644 --- a/Libs/Boost/Stacktrace.cpp +++ b/Libs/Boost/Stacktrace.cpp @@ -58,12 +58,13 @@ int main(int , char **) if (0) { std::cout << STD_TRACE_VAR(it_frame) << '\n' << std::endl; } else { - std::cout << - "module: " << ::executableName(it_frame) << "\n" - STD_TRACE_VAR(it_frame.name()) << "\n" - STD_TRACE_VAR(it_frame.address()) << "\n" - STD_TRACE_VAR(it_frame.source_file()) << "\n" - STD_TRACE_VAR(it_frame.source_line()) << std::endl; + std::cout + << "module: " << ::executableName(it_frame) << "\n" + << "\n" + << STD_TRACE_VAR(it_frame.name()) << "\n" + << STD_TRACE_VAR(it_frame.address()) << "\n" + << STD_TRACE_VAR(it_frame.source_file()) << "\n" + << STD_TRACE_VAR(it_frame.source_line()) << std::endl; } } #else From f8703d2033586dd53fc5f3df563cefd3b572f6c7 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 17:24:28 +0300 Subject: [PATCH 10/55] boost-stacktrace: Backtrace_2.cpp [108+/27-] - impl --- OS/Unix/Backtrace_2.cpp | 135 ++++++++++++++++++++++++++++++++-------- 1 file changed, 108 insertions(+), 27 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index 6f9dbd8..f09c1ee 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -13,7 +13,8 @@ //------------------------------------------------------------------------------------------------- #include #include -//#include +// #include +#include #if __cpp_lib_stacktrace #include @@ -23,20 +24,95 @@ #include #endif //------------------------------------------------------------------------------------------------- +struct mapping_entry_t +{ + uintptr_t start = 0; + uintptr_t end = 0; + uintptr_t offset_from_base = 0; + + inline bool contains_addr(const void* addr) const + { + uintptr_t addr_uint = reinterpret_cast(addr); + return addr_uint >= start && addr_uint < end; + } +}; +//------------------------------------------------------------------------------------------------- +inline uintptr_t hex_str_to_int(const std::string& str) +{ + uintptr_t out; + std::stringstream ss; + ss << std::hex << str; + ss >> out; + if(ss.eof() && !ss.fail()) { // whole stream read, with no errors + return out; + } else { + throw std::invalid_argument(std::string("can't convert '") + str + "' to hex"); + } +} +//------------------------------------------------------------------------------------------------- +inline mapping_entry_t parse_proc_maps_line(const std::string& line) +{ + std::string mapping_range_str, permissions_str, offset_from_base_str; + std::istringstream line_stream(line); + if(!std::getline(line_stream, mapping_range_str, ' ') || + !std::getline(line_stream, permissions_str, ' ') || + !std::getline(line_stream, offset_from_base_str, ' ')) { + return mapping_entry_t{}; + } + std::string mapping_start_str, mapping_end_str; + std::istringstream mapping_range_stream(mapping_range_str); + if(!std::getline(mapping_range_stream, mapping_start_str, '-') || + !std::getline(mapping_range_stream, mapping_end_str)) { + return mapping_entry_t{}; + } + mapping_entry_t mapping{}; + try { + mapping.start = hex_str_to_int(mapping_start_str); + mapping.end = hex_str_to_int(mapping_end_str); + mapping.offset_from_base = hex_str_to_int(offset_from_base_str); + return mapping; + } catch(std::invalid_argument& e) { + return mapping_entry_t{}; + } +} +//------------------------------------------------------------------------------------------------- +std::uintptr_t +get_own_proc_addr_base( + const void* addr +) +{ + std::ifstream maps_file("/proc/self/maps"); + STD_TEST(maps_file.is_open()); + + for (std::string line; std::getline(maps_file, line); ) { + const mapping_entry_t mapping = parse_proc_maps_line(line); + if (mapping.contains_addr(addr)) { + return mapping.start - mapping.offset_from_base; + } + } + + STD_TEST(false); + + return {}; +} +//------------------------------------------------------------------------------------------------- // Function to execute addr2line and get file and line number std::string getFileLine( const void *a_frame ) { + const std::uintptr_t frame = ::get_own_proc_addr_base(a_frame); + char addrStr[20 + 1] {}; - std::sprintf(addrStr, "%p", a_frame); + std::sprintf(addrStr, "%p", reinterpret_cast(frame)); + std::cout << "\t" << STD_TRACE_VAR(addrStr) << std::endl; // Prepare the command: addr2line -e
const std::string cmd = - // "addr2line -e Backtrace_2.exe -f -p " + std::string(addrStr); + "addr2line -e ./Backtrace_2.exe -f -p " + std::string(addrStr); // "addr2line -e ./Backtrace_2.exe -f -C " + std::string(addrStr); - "addr2line -f -e ./Backtrace_2.exe " + std::string(addrStr); + // "addr2line -f -e ./Backtrace_2.exe " + std::string(addrStr); // std::cout << STD_TRACE_VAR(cmd) << std::endl; // Run addr2line command to get file and line number @@ -86,31 +162,36 @@ printStackTrace() continue; } - int status {-1}; - char *demangledName = abi::__cxa_demangle(info.dli_sname, nullptr, nullptr, &status); - if (status == 0 && - demangledName != nullptr) - { - std::printf("%-3d %p: %s (+%ld) [%s]", - i, - frame, - demangledName, - (char *)frame - (char *)info.dli_saddr, - info.dli_fname); - - std::free(demangledName); - demangledName = nullptr; - } else { - std::printf("%-3d %p: %s [%s]", - i, - frame, - "[n/a]", - info.dli_fname); - } + // Func name + { + int status {-1}; + char *demangledName = abi::__cxa_demangle(info.dli_sname, nullptr, nullptr, &status); + if (status == 0 && + demangledName != nullptr) + { + std::printf("%-3d %p: %s (+%ld) [%s]", + i, + frame, + demangledName, + (char *)frame - (char *)info.dli_saddr, + info.dli_fname); + + std::free(demangledName); + demangledName = nullptr; + } else { + std::printf("%-3d %p: %s [%s]", + i, + frame, + "[n/a]", + info.dli_fname); + } + } // Get file and line information from addr2line - const std::string &fileLine = ::getFileLine(frame); - std::cout << "\n" << STD_TRACE_VAR(fileLine); + { + const std::string &fileLine = ::getFileLine(frame); + std::cout << "\t" << STD_TRACE_VAR(fileLine); + } } #endif } From f7653fff5ef2bca7e00ddc3673b5de0ae9f09af4 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 17:27:14 +0300 Subject: [PATCH 11/55] boost-stacktrace: Backtrace_2.cpp [1+/1-] - impl --- OS/Unix/Backtrace_2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index f09c1ee..f609ea4 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -110,7 +110,7 @@ getFileLine( // Prepare the command: addr2line -e
const std::string cmd = - "addr2line -e ./Backtrace_2.exe -f -p " + std::string(addrStr); + "/usr/bin/addr2line -e ./Backtrace_2.exe -f -p " + std::string(addrStr); // "addr2line -e ./Backtrace_2.exe -f -C " + std::string(addrStr); // "addr2line -f -e ./Backtrace_2.exe " + std::string(addrStr); // std::cout << STD_TRACE_VAR(cmd) << std::endl; From c752cf31c1ece0dc8c4c99ec34c0bc46c376e96b Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 17:52:36 +0300 Subject: [PATCH 12/55] boost-stacktrace: Backtrace_2.cpp [42+/7-] - impl --- OS/Unix/Backtrace_2.cpp | 49 +++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index f609ea4..adb0f36 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -102,17 +102,16 @@ getFileLine( const void *a_frame ) { - const std::uintptr_t frame = ::get_own_proc_addr_base(a_frame); - char addrStr[20 + 1] {}; - std::sprintf(addrStr, "%p", reinterpret_cast(frame)); - std::cout << "\t" << STD_TRACE_VAR(addrStr) << std::endl; + std::sprintf(addrStr, "%p", a_frame); + // std::cout << "\t" << STD_TRACE_VAR(addrStr) << std::endl; // Prepare the command: addr2line -e
const std::string cmd = - "/usr/bin/addr2line -e ./Backtrace_2.exe -f -p " + std::string(addrStr); + // "/usr/bin/addr2line -e ./Backtrace_2.exe -f -p " + std::string(addrStr); // "addr2line -e ./Backtrace_2.exe -f -C " + std::string(addrStr); // "addr2line -f -e ./Backtrace_2.exe " + std::string(addrStr); + "/usr/bin/addr2line -e ./Backtrace_2.exe -C -p " + std::string(addrStr); // std::cout << STD_TRACE_VAR(cmd) << std::endl; // Run addr2line command to get file and line number @@ -131,6 +130,33 @@ getFileLine( return result; } //------------------------------------------------------------------------------------------------- +std::string +source_location(const void* addr, bool position_independent) +{ + uintptr_t addr_base = 0; + if (position_independent) { + addr_base = ::get_own_proc_addr_base(addr); + } + const void* offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); + + +#if 0 + std::string source_line = boost::stacktrace::detail::addr2line("-Cpe", reinterpret_cast(offset)); + if (source_line.empty() || source_line[0] == '?') { + return ""; + } + + return source_line; +#else + std::string source_line = ::getFileLine(offset); + if (source_line.empty() || source_line[0] == '?') { + return ""; + } + + return source_line; +#endif +} +//------------------------------------------------------------------------------------------------- void printStackTrace() { @@ -189,8 +215,17 @@ printStackTrace() // Get file and line information from addr2line { - const std::string &fileLine = ::getFileLine(frame); - std::cout << "\t" << STD_TRACE_VAR(fileLine); + // const std::string &fileLine = ::getFileLine(frame); + std::string fileLine = ::source_location(frame, false); + if ( fileLine.empty() ) { + fileLine = ::source_location(frame, true); + } + + if (fileLine.empty()) { + fileLine = "[0]"; + } + + std::cout << "\t" << STD_TRACE_VAR(fileLine) << std::endl; } } #endif From 95406d14ee4e321e95a617c207fe77216eecc308 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 18:10:23 +0300 Subject: [PATCH 13/55] boost-stacktrace: Backtrace_2.cpp [7+/29-] - impl --- OS/Unix/Backtrace_2.cpp | 36 +++++++----------------------------- 1 file changed, 7 insertions(+), 29 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index adb0f36..f85e579 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -111,7 +111,8 @@ getFileLine( // "/usr/bin/addr2line -e ./Backtrace_2.exe -f -p " + std::string(addrStr); // "addr2line -e ./Backtrace_2.exe -f -C " + std::string(addrStr); // "addr2line -f -e ./Backtrace_2.exe " + std::string(addrStr); - "/usr/bin/addr2line -e ./Backtrace_2.exe -C -p " + std::string(addrStr); + // "/usr/bin/addr2line -e ./Backtrace_2.exe -C -p " + std::string(addrStr); + "/usr/bin/addr2line --exe=./Backtrace_2.exe --functions --demangle --inlines --pretty-print " + std::string(addrStr); // std::cout << STD_TRACE_VAR(cmd) << std::endl; // Run addr2line command to get file and line number @@ -127,6 +128,11 @@ getFileLine( ::pclose(pipe); + // Trimming + while (!result.empty() && (result[result.size() - 1] == '\n' || result[result.size() - 1] == '\r')) { + result.erase(result.size() - 1); + } + return result; } //------------------------------------------------------------------------------------------------- @@ -177,8 +183,6 @@ printStackTrace() } for (int i = 0; i < addr_size; ++i) { - std::cout << "\n"; - const void *frame = frames[i]; Dl_info info {}; @@ -251,30 +255,4 @@ main(int, char** argv) #if OUTPUT -argv[0]: ././Backtrace_2.exe - -0 0x6118eab11ce9: printStackTrace() (+138) [././Backtrace_2.exe] -fileLine: ?? -??:0 - -1 0x6118eab11f9f: testFunction() (+13) [././Backtrace_2.exe] -fileLine: ?? -??:0 - -2 0x6118eab11ffa: [n/a] [././Backtrace_2.exe] -fileLine: ?? -??:0 - -3 0x738d46229d90: [n/a] [/lib/x86_64-linux-gnu/libc.so.6] -fileLine: ?? -??:0 - -4 0x738d46229e40: [n/a] [/lib/x86_64-linux-gnu/libc.so.6] -fileLine: ?? -??:0 - -5 0x6118eab11805: [n/a] [././Backtrace_2.exe] -fileLine: ?? -??:0 - #endif From 07e94f5efaad751fbaeab29df047ebf5b37a1de1 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 18:19:07 +0300 Subject: [PATCH 14/55] boost-stacktrace: Backtrace_2.cpp [3+/5-] - impl --- OS/Unix/Backtrace_2.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index f85e579..79de6dd 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -108,11 +108,9 @@ getFileLine( // Prepare the command: addr2line -e
const std::string cmd = - // "/usr/bin/addr2line -e ./Backtrace_2.exe -f -p " + std::string(addrStr); - // "addr2line -e ./Backtrace_2.exe -f -C " + std::string(addrStr); - // "addr2line -f -e ./Backtrace_2.exe " + std::string(addrStr); - // "/usr/bin/addr2line -e ./Backtrace_2.exe -C -p " + std::string(addrStr); - "/usr/bin/addr2line --exe=./Backtrace_2.exe --functions --demangle --inlines --pretty-print " + std::string(addrStr); + "addr2line --exe=./Backtrace_2.exe " + "--functions --demangle --inlines --pretty-print " + + std::string(addrStr); // std::cout << STD_TRACE_VAR(cmd) << std::endl; // Run addr2line command to get file and line number From 4ec31af7f29439d4697e965b3be682ad56f3d1f5 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 18:23:31 +0300 Subject: [PATCH 15/55] boost-stacktrace: Backtrace_2.cpp [1-] - impl --- OS/Unix/Backtrace_2.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index 79de6dd..84093ae 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -113,7 +113,6 @@ getFileLine( std::string(addrStr); // std::cout << STD_TRACE_VAR(cmd) << std::endl; - // Run addr2line command to get file and line number FILE *pipe = ::popen(cmd.c_str(), "r"); STD_TEST_PTR(pipe); From ee945e6f7df9b4ffe1844a8728dc3a7b09831b88 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 18:25:18 +0300 Subject: [PATCH 16/55] boost-stacktrace: Backtrace_2.cpp [2+/2-] - impl --- OS/Unix/Backtrace_2.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index 84093ae..ddf9fd2 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -102,6 +102,8 @@ getFileLine( const void *a_frame ) { + std::string result; + char addrStr[20 + 1] {}; std::sprintf(addrStr, "%p", a_frame); // std::cout << "\t" << STD_TRACE_VAR(addrStr) << std::endl; @@ -116,8 +118,6 @@ getFileLine( FILE *pipe = ::popen(cmd.c_str(), "r"); STD_TEST_PTR(pipe); - std::string result; - char buffer[256] {}; while (std::fgets(buffer, sizeof(buffer), pipe) != nullptr) { result += buffer; From ff6ce3293242f390f7ce471b6ad5f7a602d5f6b8 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 18:31:51 +0300 Subject: [PATCH 17/55] boost-stacktrace: Backtrace_2.cpp [39+/20-] - impl --- OS/Unix/Backtrace_2.cpp | 59 +++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index ddf9fd2..9c31665 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -26,59 +26,74 @@ //------------------------------------------------------------------------------------------------- struct mapping_entry_t { - uintptr_t start = 0; - uintptr_t end = 0; - uintptr_t offset_from_base = 0; + uintptr_t start {}; + uintptr_t end {}; + uintptr_t offset_from_base {}; - inline bool contains_addr(const void* addr) const + bool contains_addr(const void* addr) const { - uintptr_t addr_uint = reinterpret_cast(addr); + const uintptr_t addr_uint = reinterpret_cast(addr); return addr_uint >= start && addr_uint < end; } }; //------------------------------------------------------------------------------------------------- -inline uintptr_t hex_str_to_int(const std::string& str) +uintptr_t +hex_str_to_int( + const std::string &str +) { uintptr_t out; + std::stringstream ss; ss << std::hex << str; ss >> out; - if(ss.eof() && !ss.fail()) { // whole stream read, with no errors + + if (ss.eof() && !ss.fail()) { // whole stream read, with no errors return out; } else { throw std::invalid_argument(std::string("can't convert '") + str + "' to hex"); } } //------------------------------------------------------------------------------------------------- -inline mapping_entry_t parse_proc_maps_line(const std::string& line) +mapping_entry_t +parse_proc_maps_line( + const std::string &line +) { std::string mapping_range_str, permissions_str, offset_from_base_str; std::istringstream line_stream(line); + if(!std::getline(line_stream, mapping_range_str, ' ') || !std::getline(line_stream, permissions_str, ' ') || !std::getline(line_stream, offset_from_base_str, ' ')) { return mapping_entry_t{}; } + std::string mapping_start_str, mapping_end_str; std::istringstream mapping_range_stream(mapping_range_str); + if(!std::getline(mapping_range_stream, mapping_start_str, '-') || !std::getline(mapping_range_stream, mapping_end_str)) { return mapping_entry_t{}; } - mapping_entry_t mapping{}; + + mapping_entry_t mapping {}; + try { - mapping.start = hex_str_to_int(mapping_start_str); - mapping.end = hex_str_to_int(mapping_end_str); + mapping.start = hex_str_to_int(mapping_start_str); + mapping.end = hex_str_to_int(mapping_end_str); mapping.offset_from_base = hex_str_to_int(offset_from_base_str); + return mapping; - } catch(std::invalid_argument& e) { - return mapping_entry_t{}; + } + catch (const std::invalid_argument& e) { + return {}; } } //------------------------------------------------------------------------------------------------- std::uintptr_t get_own_proc_addr_base( - const void* addr + const void *addr ) { std::ifstream maps_file("/proc/self/maps"); @@ -86,7 +101,7 @@ get_own_proc_addr_base( for (std::string line; std::getline(maps_file, line); ) { const mapping_entry_t mapping = parse_proc_maps_line(line); - if (mapping.contains_addr(addr)) { + if ( mapping.contains_addr(addr) ) { return mapping.start - mapping.offset_from_base; } } @@ -134,14 +149,18 @@ getFileLine( } //------------------------------------------------------------------------------------------------- std::string -source_location(const void* addr, bool position_independent) +source_location( + const void *addr, + const bool position_independent +) { - uintptr_t addr_base = 0; + uintptr_t addr_base {}; + if (position_independent) { addr_base = ::get_own_proc_addr_base(addr); } - const void* offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); + const void* offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); #if 0 std::string source_line = boost::stacktrace::detail::addr2line("-Cpe", reinterpret_cast(offset)); @@ -151,9 +170,9 @@ source_location(const void* addr, bool position_independent) return source_line; #else - std::string source_line = ::getFileLine(offset); + const std::string source_line = ::getFileLine(offset); if (source_line.empty() || source_line[0] == '?') { - return ""; + return {}; } return source_line; From 931e429f068c459deed76190ba6f7edbec651f73 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 18:38:14 +0300 Subject: [PATCH 18/55] boost-stacktrace: Backtrace_2.cpp [25+/16-] - impl --- OS/Unix/Backtrace_2.cpp | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index 9c31665..120b49e 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -48,11 +48,14 @@ hex_str_to_int( ss << std::hex << str; ss >> out; - if (ss.eof() && !ss.fail()) { // whole stream read, with no errors + // whole stream read, with no errors + if (ss.eof() && + !ss.fail()) + { return out; - } else { - throw std::invalid_argument(std::string("can't convert '") + str + "' to hex"); } + + throw std::invalid_argument(std::string("can't convert '") + str + "' to hex"); } //------------------------------------------------------------------------------------------------- mapping_entry_t @@ -63,18 +66,20 @@ parse_proc_maps_line( std::string mapping_range_str, permissions_str, offset_from_base_str; std::istringstream line_stream(line); - if(!std::getline(line_stream, mapping_range_str, ' ') || + if (!std::getline(line_stream, mapping_range_str, ' ') || !std::getline(line_stream, permissions_str, ' ') || - !std::getline(line_stream, offset_from_base_str, ' ')) { - return mapping_entry_t{}; + !std::getline(line_stream, offset_from_base_str, ' ')) + { + return {}; } std::string mapping_start_str, mapping_end_str; std::istringstream mapping_range_stream(mapping_range_str); - if(!std::getline(mapping_range_stream, mapping_start_str, '-') || - !std::getline(mapping_range_stream, mapping_end_str)) { - return mapping_entry_t{}; + if (!std::getline(mapping_range_stream, mapping_start_str, '-') || + !std::getline(mapping_range_stream, mapping_end_str)) + { + return {}; } mapping_entry_t mapping {}; @@ -86,7 +91,7 @@ parse_proc_maps_line( return mapping; } - catch (const std::invalid_argument& e) { + catch (const std::invalid_argument &e) { return {}; } } @@ -141,7 +146,11 @@ getFileLine( ::pclose(pipe); // Trimming - while (!result.empty() && (result[result.size() - 1] == '\n' || result[result.size() - 1] == '\r')) { + while ( + !result.empty() && + (result[result.size() - 1] == '\n' || result[result.size() - 1] == '\r') + ) + { result.erase(result.size() - 1); } @@ -160,7 +169,7 @@ source_location( addr_base = ::get_own_proc_addr_base(addr); } - const void* offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); + const auto offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); #if 0 std::string source_line = boost::stacktrace::detail::addr2line("-Cpe", reinterpret_cast(offset)); @@ -170,8 +179,10 @@ source_location( return source_line; #else - const std::string source_line = ::getFileLine(offset); - if (source_line.empty() || source_line[0] == '?') { + const std::string source_line = ::getFileLine(offset); + if (source_line.empty() || + source_line[0] == '?') + { return {}; } @@ -260,8 +271,6 @@ testFunction() int main(int, char** argv) { - std::cout << STD_TRACE_VAR(argv[0]) << std::endl; - ::testFunction(); return EXIT_SUCCESS; From 0760b77ee38ee1a34e1cf80d1c0faa79d6539f8a Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 18:50:01 +0300 Subject: [PATCH 19/55] boost-stacktrace: Backtrace_2.cpp [3+/14-] - impl --- OS/Unix/Backtrace_2.cpp | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index 120b49e..f9c6b94 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -16,13 +16,9 @@ // #include #include -#if __cpp_lib_stacktrace - #include -#else - #include - #include - #include -#endif +#include +#include +#include //------------------------------------------------------------------------------------------------- struct mapping_entry_t { @@ -193,12 +189,6 @@ source_location( void printStackTrace() { -#if __cpp_lib_stacktrace - #warning "__cpp_lib_stacktrace - defined" - - auto trace = std::stacktrace::current(); - std::cout << std::to_string(trace) << std::endl; -#else const int frames_max = 10; void *frames[frames_max] {}; @@ -259,7 +249,6 @@ printStackTrace() std::cout << "\t" << STD_TRACE_VAR(fileLine) << std::endl; } } -#endif } //------------------------------------------------------------------------------------------------- void From cfe25d9e1f06274d926cb1042c0f83b0a69ca839 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 18:51:15 +0300 Subject: [PATCH 20/55] boost-stacktrace: Backtrace_2.cpp [6+/5-] - impl --- OS/Unix/Backtrace_2.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index f9c6b94..0b2872b 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -29,7 +29,8 @@ struct mapping_entry_t bool contains_addr(const void* addr) const { const uintptr_t addr_uint = reinterpret_cast(addr); - return addr_uint >= start && addr_uint < end; + + return (addr_uint >= start && addr_uint < end); } }; //------------------------------------------------------------------------------------------------- @@ -81,9 +82,9 @@ parse_proc_maps_line( mapping_entry_t mapping {}; try { - mapping.start = hex_str_to_int(mapping_start_str); - mapping.end = hex_str_to_int(mapping_end_str); - mapping.offset_from_base = hex_str_to_int(offset_from_base_str); + mapping.start = ::hex_str_to_int(mapping_start_str); + mapping.end = ::hex_str_to_int(mapping_end_str); + mapping.offset_from_base = ::hex_str_to_int(offset_from_base_str); return mapping; } @@ -101,7 +102,7 @@ get_own_proc_addr_base( STD_TEST(maps_file.is_open()); for (std::string line; std::getline(maps_file, line); ) { - const mapping_entry_t mapping = parse_proc_maps_line(line); + const mapping_entry_t mapping = ::parse_proc_maps_line(line); if ( mapping.contains_addr(addr) ) { return mapping.start - mapping.offset_from_base; } From 1736248da97bc06dab6105f2e8aae865792759a8 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 18:52:54 +0300 Subject: [PATCH 21/55] boost-stacktrace: Backtrace_2.cpp [7+/4-] - impl --- OS/Unix/Backtrace_2.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index 0b2872b..7a70e49 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -60,9 +60,11 @@ parse_proc_maps_line( const std::string &line ) { - std::string mapping_range_str, permissions_str, offset_from_base_str; - std::istringstream line_stream(line); + std::string mapping_range_str; + std::string permissions_str; + std::string offset_from_base_str; + std::istringstream line_stream(line); if (!std::getline(line_stream, mapping_range_str, ' ') || !std::getline(line_stream, permissions_str, ' ') || !std::getline(line_stream, offset_from_base_str, ' ')) @@ -70,9 +72,10 @@ parse_proc_maps_line( return {}; } - std::string mapping_start_str, mapping_end_str; - std::istringstream mapping_range_stream(mapping_range_str); + std::string mapping_start_str; + std::string mapping_end_str; + std::istringstream mapping_range_stream(mapping_range_str); if (!std::getline(mapping_range_stream, mapping_start_str, '-') || !std::getline(mapping_range_stream, mapping_end_str)) { From 59dd890ddc3933774fdea1abb92a089f0b67c9d3 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 18:54:44 +0300 Subject: [PATCH 22/55] boost-stacktrace: Backtrace_2.cpp [9+/9-] - impl --- OS/Unix/Backtrace_2.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index 7a70e49..d2411ba 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -26,9 +26,9 @@ struct mapping_entry_t uintptr_t end {}; uintptr_t offset_from_base {}; - bool contains_addr(const void* addr) const + bool contains_addr(const void *a_addr) const { - const uintptr_t addr_uint = reinterpret_cast(addr); + const uintptr_t addr_uint = reinterpret_cast(a_addr); return (addr_uint >= start && addr_uint < end); } @@ -36,13 +36,13 @@ struct mapping_entry_t //------------------------------------------------------------------------------------------------- uintptr_t hex_str_to_int( - const std::string &str + const std::string &a_str ) { uintptr_t out; std::stringstream ss; - ss << std::hex << str; + ss << std::hex << a_str; ss >> out; // whole stream read, with no errors @@ -52,19 +52,19 @@ hex_str_to_int( return out; } - throw std::invalid_argument(std::string("can't convert '") + str + "' to hex"); + throw std::invalid_argument(std::string("can't convert '") + a_str + "' to hex"); } //------------------------------------------------------------------------------------------------- mapping_entry_t parse_proc_maps_line( - const std::string &line + const std::string &a_line ) { std::string mapping_range_str; std::string permissions_str; std::string offset_from_base_str; - std::istringstream line_stream(line); + std::istringstream line_stream(a_line); if (!std::getline(line_stream, mapping_range_str, ' ') || !std::getline(line_stream, permissions_str, ' ') || !std::getline(line_stream, offset_from_base_str, ' ')) @@ -98,7 +98,7 @@ parse_proc_maps_line( //------------------------------------------------------------------------------------------------- std::uintptr_t get_own_proc_addr_base( - const void *addr + const void *a_addr ) { std::ifstream maps_file("/proc/self/maps"); @@ -106,7 +106,7 @@ get_own_proc_addr_base( for (std::string line; std::getline(maps_file, line); ) { const mapping_entry_t mapping = ::parse_proc_maps_line(line); - if ( mapping.contains_addr(addr) ) { + if ( mapping.contains_addr(a_addr) ) { return mapping.start - mapping.offset_from_base; } } From 184aa27e99084cc364be9754afa6a86852f656b4 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 18:55:38 +0300 Subject: [PATCH 23/55] boost-stacktrace: Backtrace_2.cpp [128+/126-] - impl --- OS/Unix/Backtrace_2.cpp | 254 ++++++++++++++++++++-------------------- 1 file changed, 128 insertions(+), 126 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index d2411ba..b6f729e 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -22,16 +22,16 @@ //------------------------------------------------------------------------------------------------- struct mapping_entry_t { - uintptr_t start {}; - uintptr_t end {}; - uintptr_t offset_from_base {}; + uintptr_t start {}; + uintptr_t end {}; + uintptr_t offset_from_base {}; - bool contains_addr(const void *a_addr) const - { - const uintptr_t addr_uint = reinterpret_cast(a_addr); + bool contains_addr(const void *a_addr) const + { + const uintptr_t addr_uint = reinterpret_cast(a_addr); - return (addr_uint >= start && addr_uint < end); - } + return (addr_uint >= start && addr_uint < end); + } }; //------------------------------------------------------------------------------------------------- uintptr_t @@ -39,20 +39,20 @@ hex_str_to_int( const std::string &a_str ) { - uintptr_t out; + uintptr_t out; - std::stringstream ss; - ss << std::hex << a_str; - ss >> out; + std::stringstream ss; + ss << std::hex << a_str; + ss >> out; - // whole stream read, with no errors - if (ss.eof() && - !ss.fail()) - { - return out; - } + // whole stream read, with no errors + if (ss.eof() && + !ss.fail()) + { + return out; + } - throw std::invalid_argument(std::string("can't convert '") + a_str + "' to hex"); + throw std::invalid_argument(std::string("can't convert '") + a_str + "' to hex"); } //------------------------------------------------------------------------------------------------- mapping_entry_t @@ -60,40 +60,42 @@ parse_proc_maps_line( const std::string &a_line ) { - std::string mapping_range_str; - std::string permissions_str; - std::string offset_from_base_str; - - std::istringstream line_stream(a_line); - if (!std::getline(line_stream, mapping_range_str, ' ') || - !std::getline(line_stream, permissions_str, ' ') || - !std::getline(line_stream, offset_from_base_str, ' ')) - { - return {}; - } - - std::string mapping_start_str; - std::string mapping_end_str; - - std::istringstream mapping_range_stream(mapping_range_str); - if (!std::getline(mapping_range_stream, mapping_start_str, '-') || - !std::getline(mapping_range_stream, mapping_end_str)) - { - return {}; - } - - mapping_entry_t mapping {}; - - try { - mapping.start = ::hex_str_to_int(mapping_start_str); - mapping.end = ::hex_str_to_int(mapping_end_str); - mapping.offset_from_base = ::hex_str_to_int(offset_from_base_str); - - return mapping; - } - catch (const std::invalid_argument &e) { - return {}; - } + std::string mapping_range_str; + std::string permissions_str; + std::string offset_from_base_str; + { + std::istringstream line_stream(a_line); + if (!std::getline(line_stream, mapping_range_str, ' ') || + !std::getline(line_stream, permissions_str, ' ') || + !std::getline(line_stream, offset_from_base_str, ' ')) + { + return {}; + } + } + + std::string mapping_start_str; + std::string mapping_end_str; + { + std::istringstream mapping_range_stream(mapping_range_str); + if (!std::getline(mapping_range_stream, mapping_start_str, '-') || + !std::getline(mapping_range_stream, mapping_end_str)) + { + return {}; + } + } + + mapping_entry_t mapping {}; + + try { + mapping.start = ::hex_str_to_int(mapping_start_str); + mapping.end = ::hex_str_to_int(mapping_end_str); + mapping.offset_from_base = ::hex_str_to_int(offset_from_base_str); + + return mapping; + } + catch (const std::invalid_argument &e) { + return {}; + } } //------------------------------------------------------------------------------------------------- std::uintptr_t @@ -101,60 +103,60 @@ get_own_proc_addr_base( const void *a_addr ) { - std::ifstream maps_file("/proc/self/maps"); - STD_TEST(maps_file.is_open()); + std::ifstream maps_file("/proc/self/maps"); + STD_TEST(maps_file.is_open()); - for (std::string line; std::getline(maps_file, line); ) { - const mapping_entry_t mapping = ::parse_proc_maps_line(line); - if ( mapping.contains_addr(a_addr) ) { - return mapping.start - mapping.offset_from_base; - } - } + for (std::string line; std::getline(maps_file, line); ) { + const mapping_entry_t mapping = ::parse_proc_maps_line(line); + if ( mapping.contains_addr(a_addr) ) { + return mapping.start - mapping.offset_from_base; + } + } - STD_TEST(false); + STD_TEST(false); - return {}; + return {}; } //------------------------------------------------------------------------------------------------- // Function to execute addr2line and get file and line number std::string getFileLine( - const void *a_frame + const void *a_frame ) { - std::string result; + std::string result; - char addrStr[20 + 1] {}; - std::sprintf(addrStr, "%p", a_frame); + char addrStr[20 + 1] {}; + std::sprintf(addrStr, "%p", a_frame); // std::cout << "\t" << STD_TRACE_VAR(addrStr) << std::endl; - // Prepare the command: addr2line -e
- const std::string cmd = - "addr2line --exe=./Backtrace_2.exe " - "--functions --demangle --inlines --pretty-print " + - std::string(addrStr); - // std::cout << STD_TRACE_VAR(cmd) << std::endl; - - FILE *pipe = ::popen(cmd.c_str(), "r"); - STD_TEST_PTR(pipe); - - char buffer[256] {}; - while (std::fgets(buffer, sizeof(buffer), pipe) != nullptr) { - result += buffer; - } - - ::pclose(pipe); - - // Trimming - while ( - !result.empty() && - (result[result.size() - 1] == '\n' || result[result.size() - 1] == '\r') - ) - { - result.erase(result.size() - 1); - } - - return result; + // Prepare the command: addr2line -e
+ const std::string cmd = + "addr2line --exe=./Backtrace_2.exe " + "--functions --demangle --inlines --pretty-print " + + std::string(addrStr); + // std::cout << STD_TRACE_VAR(cmd) << std::endl; + + FILE *pipe = ::popen(cmd.c_str(), "r"); + STD_TEST_PTR(pipe); + + char buffer[256] {}; + while (std::fgets(buffer, sizeof(buffer), pipe) != nullptr) { + result += buffer; + } + + ::pclose(pipe); + + // Trimming + while ( + !result.empty() && + (result[result.size() - 1] == '\n' || result[result.size() - 1] == '\r') + ) + { + result.erase(result.size() - 1); + } + + return result; } //------------------------------------------------------------------------------------------------- std::string @@ -163,13 +165,13 @@ source_location( const bool position_independent ) { - uintptr_t addr_base {}; + uintptr_t addr_base {}; - if (position_independent) { - addr_base = ::get_own_proc_addr_base(addr); - } + if (position_independent) { + addr_base = ::get_own_proc_addr_base(addr); + } - const auto offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); + const auto offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); #if 0 std::string source_line = boost::stacktrace::detail::addr2line("-Cpe", reinterpret_cast(offset)); @@ -177,7 +179,7 @@ source_location( return ""; } - return source_line; + return source_line; #else const std::string source_line = ::getFileLine(offset); if (source_line.empty() || @@ -193,27 +195,27 @@ source_location( void printStackTrace() { - const int frames_max = 10; - void *frames[frames_max] {}; - - // Capture the stack trace - int addr_size = ::backtrace(frames, frames_max); - if (addr_size == 0) { - std::cerr << "No stack trace available" << std::endl; - return; - } - - for (int i = 0; i < addr_size; ++i) { - const void *frame = frames[i]; - - Dl_info info {}; - int iRv = ::dladdr(frame, &info); - if (iRv == 0) { - std::printf("%-3d %p: [no symbol]\n", i, frame); - continue; - } - - // Func name + const int frames_max = 10; + void *frames[frames_max] {}; + + // Capture the stack trace + int addr_size = ::backtrace(frames, frames_max); + if (addr_size == 0) { + std::cerr << "No stack trace available" << std::endl; + return; + } + + for (int i = 0; i < addr_size; ++i) { + const void *frame = frames[i]; + + Dl_info info {}; + int iRv = ::dladdr(frame, &info); + if (iRv == 0) { + std::printf("%-3d %p: [no symbol]\n", i, frame); + continue; + } + + // Func name { int status {-1}; char *demangledName = abi::__cxa_demangle(info.dli_sname, nullptr, nullptr, &status); @@ -238,7 +240,7 @@ printStackTrace() } } - // Get file and line information from addr2line + // Get file and line information from addr2line { // const std::string &fileLine = ::getFileLine(frame); std::string fileLine = ::source_location(frame, false); @@ -252,21 +254,21 @@ printStackTrace() std::cout << "\t" << STD_TRACE_VAR(fileLine) << std::endl; } - } + } } //------------------------------------------------------------------------------------------------- void testFunction() { - ::printStackTrace(); + ::printStackTrace(); } //------------------------------------------------------------------------------------------------- int main(int, char** argv) { - ::testFunction(); + ::testFunction(); - return EXIT_SUCCESS; + return EXIT_SUCCESS; } //------------------------------------------------------------------------------------------------- From a4893d1104726ed8e098e607f6067dbc241b5392 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 18:58:53 +0300 Subject: [PATCH 24/55] boost-stacktrace: Backtrace_2.cpp [7+/10-] - impl --- OS/Unix/Backtrace_2.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index b6f729e..bfd4491 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -109,7 +109,7 @@ get_own_proc_addr_base( for (std::string line; std::getline(maps_file, line); ) { const mapping_entry_t mapping = ::parse_proc_maps_line(line); if ( mapping.contains_addr(a_addr) ) { - return mapping.start - mapping.offset_from_base; + return (mapping.start - mapping.offset_from_base); } } @@ -128,14 +128,11 @@ getFileLine( char addrStr[20 + 1] {}; std::sprintf(addrStr, "%p", a_frame); - // std::cout << "\t" << STD_TRACE_VAR(addrStr) << std::endl; - // Prepare the command: addr2line -e
const std::string cmd = "addr2line --exe=./Backtrace_2.exe " "--functions --demangle --inlines --pretty-print " + std::string(addrStr); - // std::cout << STD_TRACE_VAR(cmd) << std::endl; FILE *pipe = ::popen(cmd.c_str(), "r"); STD_TEST_PTR(pipe); @@ -161,17 +158,17 @@ getFileLine( //------------------------------------------------------------------------------------------------- std::string source_location( - const void *addr, - const bool position_independent + const void *a_addr, + const bool a_position_independent ) { uintptr_t addr_base {}; - if (position_independent) { - addr_base = ::get_own_proc_addr_base(addr); + if (a_position_independent) { + addr_base = ::get_own_proc_addr_base(a_addr); } - const auto offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); + const auto offset = reinterpret_cast(reinterpret_cast(a_addr) - addr_base); #if 0 std::string source_line = boost::stacktrace::detail::addr2line("-Cpe", reinterpret_cast(offset)); @@ -264,7 +261,7 @@ testFunction() } //------------------------------------------------------------------------------------------------- int -main(int, char** argv) +main(int, char**) { ::testFunction(); From 848524782977630a119ce9de30bbc52914db425e Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 19:04:27 +0300 Subject: [PATCH 25/55] boost-stacktrace: Backtrace_2.cpp [4+/3-] - impl --- OS/Unix/Backtrace_2.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index bfd4491..a867052 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -130,9 +130,10 @@ getFileLine( std::sprintf(addrStr, "%p", a_frame); const std::string cmd = - "addr2line --exe=./Backtrace_2.exe " - "--functions --demangle --inlines --pretty-print " + - std::string(addrStr); + "addr2line " + "--exe=./Backtrace_2.exe " + // "--functions --demangle --inlines --pretty-print " + + std::string(addrStr); FILE *pipe = ::popen(cmd.c_str(), "r"); STD_TEST_PTR(pipe); From b5227875a4f0d9090199b75053bee80574cd105d Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 19:53:48 +0300 Subject: [PATCH 26/55] boost-stacktrace: Backtrace_2.cpp (+2) [2+/2-] - impl --- OS/Unix/Backtrace_2.cpp | 2 +- OS/Unix/Backtrace_2.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index a867052..adfbe64 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -131,7 +131,7 @@ getFileLine( const std::string cmd = "addr2line " - "--exe=./Backtrace_2.exe " + "--exe=Backtrace_2.exe " // "--functions --demangle --inlines --pretty-print " + std::string(addrStr); diff --git a/OS/Unix/Backtrace_2.sh b/OS/Unix/Backtrace_2.sh index b1f7a83..337ab67 100755 --- a/OS/Unix/Backtrace_2.sh +++ b/OS/Unix/Backtrace_2.sh @@ -4,7 +4,7 @@ CPP_BASE_NAME="./Backtrace_2" echo "Compile ${CPP_BASE_NAME}.cpp ..." -c++ -g -O0 -rdynamic ./${CPP_BASE_NAME}.cpp -ldl -fno-omit-frame-pointer -fpermissive -o ./${CPP_BASE_NAME}.exe +c++ -g -O0 -rdynamic ./${CPP_BASE_NAME}.cpp -ldl -fno-omit-frame-pointer -fno-inline -no-pie -fpermissive -o ./${CPP_BASE_NAME}.exe echo "Run..." ./${CPP_BASE_NAME}.exe From 911452b53026d52797dd0d106bb91e489e3b5f51 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 20:12:05 +0300 Subject: [PATCH 27/55] boost-stacktrace: CMakeLists.txt [1+/1-] - impl --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e47be1f..d61ee1b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,7 +82,7 @@ foreach(IT_SOURCE ${SOURCES}) # libevent::libevent # openssl::openssl # ZLIB::ZLIB - backtrace + backtrace # https://github.com/ianlancetaylor/libbacktrace ssh2 unwind event From 2d6e314d70e073b7068dffd11bac983faed1b6fa Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 20:15:53 +0300 Subject: [PATCH 28/55] boost-stacktrace: CMakeLists.txt (+2) [3+/1-] - impl --- CMakeLists.txt | 2 +- Libs/Boost/Stacktrace.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d61ee1b..44ef756 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,7 +82,7 @@ foreach(IT_SOURCE ${SOURCES}) # libevent::libevent # openssl::openssl # ZLIB::ZLIB - backtrace # https://github.com/ianlancetaylor/libbacktrace + backtrace # https://github.com/ianlancetaylor/libbacktrace - for boost::stacktrace ssh2 unwind event diff --git a/Libs/Boost/Stacktrace.cpp b/Libs/Boost/Stacktrace.cpp index 474acd8..aaf4073 100644 --- a/Libs/Boost/Stacktrace.cpp +++ b/Libs/Boost/Stacktrace.cpp @@ -2,6 +2,8 @@ * \file Stacktrace.cpp * \brief boost::stacktrace * + * \see https://github.com/ianlancetaylor/libbacktrace + * * g++ -DBOOST_STACKTRACE_USE_ADDR2LINE -ggdb -rdynamic Stacktrace.cpp -o bb -lboost_stacktrace_addr2line -ldl -O0 -fno-omit-frame-pointer -lboost_stacktrace_addr2line && ./bb */ From 94cb325d2af5991883a46ffbccf6d89ee7a7cc0c Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 20:22:56 +0300 Subject: [PATCH 29/55] boost-stacktrace: Stacktrace.cpp [1+] - impl --- Libs/Boost/Stacktrace.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Libs/Boost/Stacktrace.cpp b/Libs/Boost/Stacktrace.cpp index aaf4073..c65a6f9 100644 --- a/Libs/Boost/Stacktrace.cpp +++ b/Libs/Boost/Stacktrace.cpp @@ -3,6 +3,7 @@ * \brief boost::stacktrace * * \see https://github.com/ianlancetaylor/libbacktrace + * sudo apt-get install libbacktrace-dev * * g++ -DBOOST_STACKTRACE_USE_ADDR2LINE -ggdb -rdynamic Stacktrace.cpp -o bb -lboost_stacktrace_addr2line -ldl -O0 -fno-omit-frame-pointer -lboost_stacktrace_addr2line && ./bb */ From 22814588393f7fcd157c1cc58d240dfbf31669a8 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 20:47:40 +0300 Subject: [PATCH 30/55] boost-stacktrace: Backtrace_2.cpp [1+/2-] - impl --- OS/Unix/Backtrace_2.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index adfbe64..683e2f1 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -84,9 +84,8 @@ parse_proc_maps_line( } } - mapping_entry_t mapping {}; - try { + mapping_entry_t mapping {}; mapping.start = ::hex_str_to_int(mapping_start_str); mapping.end = ::hex_str_to_int(mapping_end_str); mapping.offset_from_base = ::hex_str_to_int(offset_from_base_str); From 4945d7967e8e44b8e3d91acc784d5487309db320 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 20:55:39 +0300 Subject: [PATCH 31/55] boost-stacktrace: Backtrace_2.cpp [1+/1-] - impl --- OS/Unix/Backtrace_2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index 683e2f1..31d7407 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -39,7 +39,7 @@ hex_str_to_int( const std::string &a_str ) { - uintptr_t out; + uintptr_t out {}; std::stringstream ss; ss << std::hex << a_str; From b19d57a91ff95cac81ec54140a97b52f15c17fef Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 21:24:55 +0300 Subject: [PATCH 32/55] boost-stacktrace: Backtrace_2.cpp [6+/1-] - doc(s) --- OS/Unix/Backtrace_2.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index 31d7407..97fe763 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -32,6 +32,11 @@ struct mapping_entry_t return (addr_uint >= start && addr_uint < end); } + + uintptr_t addr() const + { + return (start - offset_from_base); + } }; //------------------------------------------------------------------------------------------------- uintptr_t @@ -108,7 +113,7 @@ get_own_proc_addr_base( for (std::string line; std::getline(maps_file, line); ) { const mapping_entry_t mapping = ::parse_proc_maps_line(line); if ( mapping.contains_addr(a_addr) ) { - return (mapping.start - mapping.offset_from_base); + return mapping.addr(); } } From d915d5f0a4138fea2d6ad30de5b76e5023778cca Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 21:30:03 +0300 Subject: [PATCH 33/55] boost-stacktrace: Backtrace_2.cpp [3+/1-] - impl --- OS/Unix/Backtrace_2.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index 97fe763..8bb4ee5 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -20,12 +20,14 @@ #include #include //------------------------------------------------------------------------------------------------- -struct mapping_entry_t +class mapping_entry_t { +public: uintptr_t start {}; uintptr_t end {}; uintptr_t offset_from_base {}; +public: bool contains_addr(const void *a_addr) const { const uintptr_t addr_uint = reinterpret_cast(a_addr); From 4009c78f9025969b4df1125d4a712ab85436f116 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 23:23:44 +0300 Subject: [PATCH 34/55] boost-stacktrace: Backtrace_2.sh [26+/3-] - impl --- OS/Unix/Backtrace_2.sh | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/OS/Unix/Backtrace_2.sh b/OS/Unix/Backtrace_2.sh index 337ab67..f522b68 100755 --- a/OS/Unix/Backtrace_2.sh +++ b/OS/Unix/Backtrace_2.sh @@ -1,10 +1,33 @@ #!/bin/bash +# +# \file Backtrace_2.sh +# \brief Compile +# +#-------------------------------------------------------------------------------------------------- +# vars CPP_BASE_NAME="./Backtrace_2" -echo "Compile ${CPP_BASE_NAME}.cpp ..." -c++ -g -O0 -rdynamic ./${CPP_BASE_NAME}.cpp -ldl -fno-omit-frame-pointer -fno-inline -no-pie -fpermissive -o ./${CPP_BASE_NAME}.exe +CPP_STANDART="c++20" +INCLUDE_DIR="/home/skynowa/Projects/CppTest" +#--------------------------------------------------------------------------------------------------- +# Clean +if [ -f "${CPP_BASE_NAME}.exe" ]; then + echo "${CPP_BASE_NAME}.exe - Clean..." + + rm "${CPP_BASE_NAME}.exe" +fi +#--------------------------------------------------------------------------------------------------- +# Build +echo "${CPP_BASE_NAME}.cpp - Compile..." + +c++ -std=${CPP_STANDART} -g -O0 -rdynamic ./${CPP_BASE_NAME}.cpp -ldl -fno-omit-frame-pointer -fno-inline -no-pie -fpermissive -I ${INCLUDE_DIR} -o ./${CPP_BASE_NAME}.exe +#--------------------------------------------------------------------------------------------------- +# Run +echo -e "${CPP_BASE_NAME}.exe - Run...\n" -echo "Run..." ./${CPP_BASE_NAME}.exe +#--------------------------------------------------------------------------------------------------- +echo -e "\nOK.\n" +#--------------------------------------------------------------------------------------------------- From 7ae8e3974f54ab90a9a30fefe338a8d52f4cca86 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 23:24:08 +0300 Subject: [PATCH 35/55] boost-stacktrace: Backtrace_2.cpp [182+/87-] - As classes --- OS/Unix/Backtrace_2.cpp | 269 +++++++++++++++++++++++++++------------- 1 file changed, 182 insertions(+), 87 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index 8bb4ee5..3d1773a 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -13,39 +13,76 @@ //------------------------------------------------------------------------------------------------- #include #include -// #include -#include +#include #include #include #include //------------------------------------------------------------------------------------------------- -class mapping_entry_t -{ -public: - uintptr_t start {}; - uintptr_t end {}; - uintptr_t offset_from_base {}; - -public: - bool contains_addr(const void *a_addr) const - { - const uintptr_t addr_uint = reinterpret_cast(a_addr); - return (addr_uint >= start && addr_uint < end); - } +/************************************************************************************************** +* MappingEntry +* +**************************************************************************************************/ - uintptr_t addr() const - { - return (start - offset_from_base); - } +//------------------------------------------------------------------------------------------------- +class MappingEntry + /// \see /proc/self/maps +{ +public: +///\name ctors, dtor +///\{ + MappingEntry() = default; + MappingEntry(const std::string startStr, const std::string endStr, + const std::string offsetFromBaseStr); + ~MappingEntry() = default; +///\} + + bool containsAddr(const std::uintptr_t addr) const; + uintptr_t addr() const; + +private: + const uintptr_t _start {}; + const uintptr_t _end {}; + const uintptr_t _offsetFromBase {}; + + uintptr_t _hexStrToInt(const std::string &str) const; }; //------------------------------------------------------------------------------------------------- +MappingEntry::MappingEntry( + const std::string a_startStr, + const std::string a_endStr, + const std::string a_offsetFromBaseStr +) : + _start { _hexStrToInt(a_startStr) }, + _end { _hexStrToInt(a_endStr) }, + _offsetFromBase { _hexStrToInt(a_offsetFromBaseStr) } +{ +} +//------------------------------------------------------------------------------------------------- +bool +MappingEntry::containsAddr( + const std::uintptr_t a_addr +) const +{ + STD_TEST(a_addr != 0); + + return (a_addr >= _start && a_addr < _end); +} +//------------------------------------------------------------------------------------------------- +uintptr_t +MappingEntry::addr() const +{ + return (_start - _offsetFromBase); +} +//------------------------------------------------------------------------------------------------- uintptr_t -hex_str_to_int( +MappingEntry::_hexStrToInt( const std::string &a_str -) +) const { + STD_TEST(!a_str.empty()); + uintptr_t out {}; std::stringstream ss; @@ -62,16 +99,89 @@ hex_str_to_int( throw std::invalid_argument(std::string("can't convert '") + a_str + "' to hex"); } //------------------------------------------------------------------------------------------------- -mapping_entry_t -parse_proc_maps_line( - const std::string &a_line -) + + +/************************************************************************************************** +* Mappings +* +**************************************************************************************************/ + +//------------------------------------------------------------------------------------------------- +class Mappings + /// \see /proc/self/maps +{ +public: +///\name ctors, dtor +///\{ + Mappings() = delete; + Mappings(const std::uintptr_t addr, const bool position_independent); + ~Mappings() = default; +///\} + + std::uintptr_t offset() const; + +private: + const std::uintptr_t _addr {}; + const bool _position_independent {}; + + std::uintptr_t _get_own_proc_addr_base(const std::uintptr_t addr) const; + MappingEntry _parse_proc_maps_line(const std::string &map_entry) const; +}; +//------------------------------------------------------------------------------------------------- +Mappings::Mappings( + const std::uintptr_t a_addr, + const bool a_position_independent +) : + _addr {a_addr}, + _position_independent {a_position_independent} +{ + STD_TEST(a_addr != 0); +} +//------------------------------------------------------------------------------------------------- +std::uintptr_t +Mappings::offset() const +{ + std::uintptr_t addr_base {}; + + if (_position_independent) { + addr_base = _get_own_proc_addr_base(_addr); + } + + const uintptr_t offset = _addr - addr_base; + + return offset; +} +//------------------------------------------------------------------------------------------------- +std::uintptr_t +Mappings::_get_own_proc_addr_base( + const std::uintptr_t a_addr +) const +{ + std::ifstream maps_file("/proc/self/maps"); + STD_TEST(maps_file.is_open()); + + for (std::string map_entry; std::getline(maps_file, map_entry); ) { + MappingEntry mapping = _parse_proc_maps_line(map_entry); + if ( mapping.containsAddr(a_addr) ) { + return mapping.addr(); + } + } + + STD_TEST(false); + + return {}; +} +//------------------------------------------------------------------------------------------------- +MappingEntry +Mappings::_parse_proc_maps_line( + const std::string &a_map_entry +) const { std::string mapping_range_str; std::string permissions_str; std::string offset_from_base_str; { - std::istringstream line_stream(a_line); + std::istringstream line_stream(a_map_entry); if (!std::getline(line_stream, mapping_range_str, ' ') || !std::getline(line_stream, permissions_str, ' ') || !std::getline(line_stream, offset_from_base_str, ' ')) @@ -92,65 +202,57 @@ parse_proc_maps_line( } try { - mapping_entry_t mapping {}; - mapping.start = ::hex_str_to_int(mapping_start_str); - mapping.end = ::hex_str_to_int(mapping_end_str); - mapping.offset_from_base = ::hex_str_to_int(offset_from_base_str); + MappingEntry mapping(mapping_start_str, mapping_end_str, offset_from_base_str); - return mapping; + return std::move(mapping); } catch (const std::invalid_argument &e) { return {}; } } //------------------------------------------------------------------------------------------------- -std::uintptr_t -get_own_proc_addr_base( - const void *a_addr -) -{ - std::ifstream maps_file("/proc/self/maps"); - STD_TEST(maps_file.is_open()); - for (std::string line; std::getline(maps_file, line); ) { - const mapping_entry_t mapping = ::parse_proc_maps_line(line); - if ( mapping.contains_addr(a_addr) ) { - return mapping.addr(); - } - } - STD_TEST(false); +/************************************************************************************************** +* Impl +* +**************************************************************************************************/ - return {}; -} //------------------------------------------------------------------------------------------------- // Function to execute addr2line and get file and line number std::string -getFileLine( +getAddr2line( const void *a_frame ) { + STD_TEST_PTR(a_frame); + std::string result; - char addrStr[20 + 1] {}; - std::sprintf(addrStr, "%p", a_frame); + std::string cmd; + { + char addrStr[20 + 1] {}; + std::sprintf(addrStr, "%p", a_frame); + + cmd = + "addr2line " + "--exe=Backtrace_2.exe " + // "--functions --demangle --inlines --pretty-print " + + std::string(addrStr); + } - const std::string cmd = - "addr2line " - "--exe=Backtrace_2.exe " - // "--functions --demangle --inlines --pretty-print " - + std::string(addrStr); + { + FILE *pipe = ::popen(cmd.c_str(), "r"); + STD_TEST_PTR(pipe); - FILE *pipe = ::popen(cmd.c_str(), "r"); - STD_TEST_PTR(pipe); + char buffer[256] {}; + while (std::fgets(buffer, sizeof(buffer), pipe) != nullptr) { + result += buffer; + } - char buffer[256] {}; - while (std::fgets(buffer, sizeof(buffer), pipe) != nullptr) { - result += buffer; + ::pclose(pipe); } - ::pclose(pipe); - // Trimming while ( !result.empty() && @@ -164,37 +266,31 @@ getFileLine( } //------------------------------------------------------------------------------------------------- std::string -source_location( +getFileLine( const void *a_addr, const bool a_position_independent ) { - uintptr_t addr_base {}; + STD_TEST_PTR(a_addr); - if (a_position_independent) { - addr_base = ::get_own_proc_addr_base(a_addr); - } - - const auto offset = reinterpret_cast(reinterpret_cast(a_addr) - addr_base); + Mappings mappings(reinterpret_cast(a_addr), a_position_independent); -#if 0 - std::string source_line = boost::stacktrace::detail::addr2line("-Cpe", reinterpret_cast(offset)); - if (source_line.empty() || source_line[0] == '?') { - return ""; - } - - return source_line; -#else - const std::string source_line = ::getFileLine(offset); - if (source_line.empty() || - source_line[0] == '?') + const std::string sRv = ::getAddr2line( reinterpret_cast(mappings.offset()) ); + if (sRv.empty() || + sRv[0] == '?') { return {}; } - return source_line; -#endif + return sRv; } +//------------------------------------------------------------------------------------------------- + +/************************************************************************************************** +* Test +* +**************************************************************************************************/ + //------------------------------------------------------------------------------------------------- void printStackTrace() @@ -246,17 +342,16 @@ printStackTrace() // Get file and line information from addr2line { - // const std::string &fileLine = ::getFileLine(frame); - std::string fileLine = ::source_location(frame, false); + std::string fileLine = ::getFileLine(frame, false); if ( fileLine.empty() ) { - fileLine = ::source_location(frame, true); + fileLine = ::getFileLine(frame, true); } if (fileLine.empty()) { - fileLine = "[0]"; + fileLine = "[n/a]"; } - std::cout << "\t" << STD_TRACE_VAR(fileLine) << std::endl; + std::cout << "\t" << "at " << fileLine << std::endl; } } } From 1b527922e1fbd71cf1ce11ee4eb8784a62b54031 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 23:38:02 +0300 Subject: [PATCH 36/55] boost-stacktrace: Backtrace_2.cpp [2+/2-] - comment(s) --- OS/Unix/Backtrace_2.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index 3d1773a..f674c88 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -315,7 +315,7 @@ printStackTrace() continue; } - // Func name + // SourceInfoOption::funcName { int status {-1}; char *demangledName = abi::__cxa_demangle(info.dli_sname, nullptr, nullptr, &status); @@ -340,7 +340,7 @@ printStackTrace() } } - // Get file and line information from addr2line + // SourceInfoOption::filePath, SourceInfoOption::lineNum { std::string fileLine = ::getFileLine(frame, false); if ( fileLine.empty() ) { From 1a315915f2c399066153ac2b265d2a238c246360 Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 23:41:05 +0300 Subject: [PATCH 37/55] boost-stacktrace: Backtrace_2.cpp [7+/7-] - fix --- OS/Unix/Backtrace_2.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index f674c88..2a4d030 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -33,8 +33,8 @@ class MappingEntry ///\name ctors, dtor ///\{ MappingEntry() = default; - MappingEntry(const std::string startStr, const std::string endStr, - const std::string offsetFromBaseStr); + MappingEntry(const std::string &startStr, const std::string &endStr, + const std::string &offsetFromBaseStr); ~MappingEntry() = default; ///\} @@ -50,9 +50,9 @@ class MappingEntry }; //------------------------------------------------------------------------------------------------- MappingEntry::MappingEntry( - const std::string a_startStr, - const std::string a_endStr, - const std::string a_offsetFromBaseStr + const std::string &a_startStr, + const std::string &a_endStr, + const std::string &a_offsetFromBaseStr ) : _start { _hexStrToInt(a_startStr) }, _end { _hexStrToInt(a_endStr) }, @@ -204,7 +204,7 @@ Mappings::_parse_proc_maps_line( try { MappingEntry mapping(mapping_start_str, mapping_end_str, offset_from_base_str); - return std::move(mapping); + return mapping; } catch (const std::invalid_argument &e) { return {}; @@ -326,7 +326,7 @@ printStackTrace() i, frame, demangledName, - (char *)frame - (char *)info.dli_saddr, + reinterpret_cast(frame) - reinterpret_cast(info.dli_saddr), info.dli_fname); std::free(demangledName); From fae4e564397e08a23d413037a53933291bda4caa Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 27 Sep 2024 23:47:04 +0300 Subject: [PATCH 38/55] boost-stacktrace: Backtrace_2.cpp [7+/7-] - impl --- OS/Unix/Backtrace_2.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_2.cpp index 2a4d030..60906ee 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_2.cpp @@ -322,21 +322,21 @@ printStackTrace() if (status == 0 && demangledName != nullptr) { - std::printf("%-3d %p: %s (+%ld) [%s]", + std::printf("%-3d [%s] %p: %s (+%ld)", i, + info.dli_fname, frame, demangledName, - reinterpret_cast(frame) - reinterpret_cast(info.dli_saddr), - info.dli_fname); + reinterpret_cast(frame) - reinterpret_cast(info.dli_saddr)); std::free(demangledName); demangledName = nullptr; } else { - std::printf("%-3d %p: %s [%s]", + std::printf("%-3d [%s] %p: %s", i, + info.dli_fname, frame, - "[n/a]", - info.dli_fname); + "[n/a]"); } } @@ -351,7 +351,7 @@ printStackTrace() fileLine = "[n/a]"; } - std::cout << "\t" << "at " << fileLine << std::endl; + std::cout << " " << "at " << fileLine << std::endl; } } } From 1db3ee00687d47640067801fa7a0560785d9901b Mon Sep 17 00:00:00 2001 From: skynowa Date: Sat, 28 Sep 2024 01:56:24 +0300 Subject: [PATCH 39/55] boost-stacktrace: CMakeLists.txt [3+/3-] - impl --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 44ef756..e267f8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,10 +23,10 @@ if (NOT CMAKE_BUILD_TYPE) endif() #-------------------------------------------------------------------------------------------------- find_package(X11 REQUIRED) -# find_package(Libssh2 REQUIRED) +find_package(Libssh2 REQUIRED) # find_package(Libevent REQUIRED) -# find_package(OpenSSL REQUIRED) -# find_package(ZLIB REQUIRED) +find_package(OpenSSL REQUIRED) +find_package(ZLIB REQUIRED) #-------------------------------------------------------------------------------------------------- file(GLOB_RECURSE SOURCES ${CMAKE_SOURCE_DIR}/*.c From 50bcab005bb87321ad2cfaa2c2640df258ad2c66 Mon Sep 17 00:00:00 2001 From: skynowa Date: Sat, 28 Sep 2024 02:10:39 +0300 Subject: [PATCH 40/55] boost-stacktrace: {Backtrace_2.sh => Backtrace_addr2line.sh} (+2) [3+/3-] - rename --- OS/Unix/{Backtrace_2.cpp => Backtrace_addr2line.cpp} | 2 +- OS/Unix/{Backtrace_2.sh => Backtrace_addr2line.sh} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename OS/Unix/{Backtrace_2.cpp => Backtrace_addr2line.cpp} (99%) rename OS/Unix/{Backtrace_2.sh => Backtrace_addr2line.sh} (94%) diff --git a/OS/Unix/Backtrace_2.cpp b/OS/Unix/Backtrace_addr2line.cpp similarity index 99% rename from OS/Unix/Backtrace_2.cpp rename to OS/Unix/Backtrace_addr2line.cpp index 60906ee..4ac59b8 100644 --- a/OS/Unix/Backtrace_2.cpp +++ b/OS/Unix/Backtrace_addr2line.cpp @@ -236,7 +236,7 @@ getAddr2line( cmd = "addr2line " - "--exe=Backtrace_2.exe " + "--exe=Backtrace_addr2line.exe " // "--functions --demangle --inlines --pretty-print " + std::string(addrStr); } diff --git a/OS/Unix/Backtrace_2.sh b/OS/Unix/Backtrace_addr2line.sh similarity index 94% rename from OS/Unix/Backtrace_2.sh rename to OS/Unix/Backtrace_addr2line.sh index f522b68..1eedf2f 100755 --- a/OS/Unix/Backtrace_2.sh +++ b/OS/Unix/Backtrace_addr2line.sh @@ -1,13 +1,13 @@ #!/bin/bash # -# \file Backtrace_2.sh +# \file Backtrace_addr2line.sh # \brief Compile # #-------------------------------------------------------------------------------------------------- # vars -CPP_BASE_NAME="./Backtrace_2" +CPP_BASE_NAME="Backtrace_addr2line" CPP_STANDART="c++20" INCLUDE_DIR="/home/skynowa/Projects/CppTest" From 32f67daffab2aa489952d0f31cb6cc8efa79c1b3 Mon Sep 17 00:00:00 2001 From: skynowa Date: Sat, 28 Sep 2024 02:10:45 +0300 Subject: [PATCH 41/55] boost-stacktrace: Readme.md [2+/2-] - rename --- Readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Readme.md b/Readme.md index fc56e15..fe3076a 100644 --- a/Readme.md +++ b/Readme.md @@ -1,4 +1,4 @@ -# C++ Roadmap **27-Sep-2024** ![GitHub Watchers](https://img.shields.io/github/watchers/skynowa/CppTest) ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/skynowa/CppTest/CI) +# C++ Roadmap **28-Sep-2024** ![GitHub Watchers](https://img.shields.io/github/watchers/skynowa/CppTest) ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/skynowa/CppTest/CI) - [Algos](#algos "Algorithms") █░░░░░░░░░ 14% (14) - [Backend](#backend "[ ] Backend skills") ░░░░░░░░░░ 0% (2) @@ -915,8 +915,8 @@ 📁 ⌛ Unix 50% (6) * 🖊 `Umask.cpp` + * ❌ Backtrace_addr2line.cpp * ✅ `Backtrace.cpp` - * ❌ Backtrace_2.cpp * ❌ Backtrace_libunwind.cpp * ❌ 📝 FAQ.md * 🖊 `Fork.cpp` From e236f2cb2b8ae0ea2d1952ccb2b9664c18440aec Mon Sep 17 00:00:00 2001 From: skynowa Date: Sat, 28 Sep 2024 02:38:21 +0300 Subject: [PATCH 42/55] boost-stacktrace: Backtrace_addr2line.cpp [2+/2-] - impl --- OS/Unix/Backtrace_addr2line.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OS/Unix/Backtrace_addr2line.cpp b/OS/Unix/Backtrace_addr2line.cpp index 4ac59b8..3b70194 100644 --- a/OS/Unix/Backtrace_addr2line.cpp +++ b/OS/Unix/Backtrace_addr2line.cpp @@ -1,6 +1,6 @@ /** - * \file Backtrace.cpp - * \brief Bactrace + * \file Backtrace_addr2line.cpp + * \brief Bactrace by addr2line * * \code{.console} * From aa3a7744cd1fa73a5bf0ce351af2235b0fb8ab8f Mon Sep 17 00:00:00 2001 From: skynowa Date: Sat, 28 Sep 2024 02:42:57 +0300 Subject: [PATCH 43/55] boost-stacktrace: Readme.md [1+/1-] - update --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index fe3076a..bc86c0c 100644 --- a/Readme.md +++ b/Readme.md @@ -915,7 +915,7 @@ 📁 ⌛ Unix 50% (6) * 🖊 `Umask.cpp` - * ❌ Backtrace_addr2line.cpp + * ❌ Backtrace_addr2line.cpp * ✅ `Backtrace.cpp` * ❌ Backtrace_libunwind.cpp * ❌ 📝 FAQ.md From 062589be267aaeabcd0350a93ee6351ea45719a0 Mon Sep 17 00:00:00 2001 From: skynowa Date: Sat, 5 Oct 2024 20:40:15 +0300 Subject: [PATCH 44/55] boost-stacktrace: Backtrace_addr2line.cpp [15+/14-] - code style --- OS/Unix/Backtrace_addr2line.cpp | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/OS/Unix/Backtrace_addr2line.cpp b/OS/Unix/Backtrace_addr2line.cpp index 3b70194..fbe7d69 100644 --- a/OS/Unix/Backtrace_addr2line.cpp +++ b/OS/Unix/Backtrace_addr2line.cpp @@ -114,7 +114,7 @@ class Mappings ///\name ctors, dtor ///\{ Mappings() = delete; - Mappings(const std::uintptr_t addr, const bool position_independent); + Mappings(const std::uintptr_t addr, const bool positionIndependent); ~Mappings() = default; ///\} @@ -122,18 +122,18 @@ class Mappings private: const std::uintptr_t _addr {}; - const bool _position_independent {}; + const bool _positionIndependent {}; - std::uintptr_t _get_own_proc_addr_base(const std::uintptr_t addr) const; - MappingEntry _parse_proc_maps_line(const std::string &map_entry) const; + std::uintptr_t _getOwnProcAddrBase(const std::uintptr_t addr) const; + MappingEntry _parseProcMapsLine(const std::string &map_entry) const; }; //------------------------------------------------------------------------------------------------- Mappings::Mappings( const std::uintptr_t a_addr, - const bool a_position_independent + const bool a_positionIndependent ) : - _addr {a_addr}, - _position_independent {a_position_independent} + _addr {a_addr}, + _positionIndependent {a_positionIndependent} { STD_TEST(a_addr != 0); } @@ -143,8 +143,8 @@ Mappings::offset() const { std::uintptr_t addr_base {}; - if (_position_independent) { - addr_base = _get_own_proc_addr_base(_addr); + if (_positionIndependent) { + addr_base = _getOwnProcAddrBase(_addr); } const uintptr_t offset = _addr - addr_base; @@ -153,7 +153,7 @@ Mappings::offset() const } //------------------------------------------------------------------------------------------------- std::uintptr_t -Mappings::_get_own_proc_addr_base( +Mappings::_getOwnProcAddrBase( const std::uintptr_t a_addr ) const { @@ -161,7 +161,7 @@ Mappings::_get_own_proc_addr_base( STD_TEST(maps_file.is_open()); for (std::string map_entry; std::getline(maps_file, map_entry); ) { - MappingEntry mapping = _parse_proc_maps_line(map_entry); + MappingEntry mapping = _parseProcMapsLine(map_entry); if ( mapping.containsAddr(a_addr) ) { return mapping.addr(); } @@ -173,7 +173,7 @@ Mappings::_get_own_proc_addr_base( } //------------------------------------------------------------------------------------------------- MappingEntry -Mappings::_parse_proc_maps_line( +Mappings::_parseProcMapsLine( const std::string &a_map_entry ) const { @@ -268,12 +268,12 @@ getAddr2line( std::string getFileLine( const void *a_addr, - const bool a_position_independent + const bool a_positionIndependent ) { STD_TEST_PTR(a_addr); - Mappings mappings(reinterpret_cast(a_addr), a_position_independent); + Mappings mappings(reinterpret_cast(a_addr), a_positionIndependent); const std::string sRv = ::getAddr2line( reinterpret_cast(mappings.offset()) ); if (sRv.empty() || @@ -286,6 +286,7 @@ getFileLine( } //------------------------------------------------------------------------------------------------- + /************************************************************************************************** * Test * From 28a2071ea1cf59ba236f58e31c25a9e394dee047 Mon Sep 17 00:00:00 2001 From: skynowa Date: Sat, 5 Oct 2024 20:40:24 +0300 Subject: [PATCH 45/55] boost-stacktrace: Readme.md [1+/1-] - code style --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index bc86c0c..8178e8c 100644 --- a/Readme.md +++ b/Readme.md @@ -1,4 +1,4 @@ -# C++ Roadmap **28-Sep-2024** ![GitHub Watchers](https://img.shields.io/github/watchers/skynowa/CppTest) ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/skynowa/CppTest/CI) +# C++ Roadmap **05-Oct-2024** ![GitHub Watchers](https://img.shields.io/github/watchers/skynowa/CppTest) ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/skynowa/CppTest/CI) - [Algos](#algos "Algorithms") █░░░░░░░░░ 14% (14) - [Backend](#backend "[ ] Backend skills") ░░░░░░░░░░ 0% (2) From ad38219be8b04d3691c2d58a5bc63ee2b9885694 Mon Sep 17 00:00:00 2001 From: skynowa Date: Mon, 14 Oct 2024 21:28:05 +0300 Subject: [PATCH 46/55] boost-stacktrace: Cpp.cpp [33+/3-] - impl --- Syntax/Cpp.cpp | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/Syntax/Cpp.cpp b/Syntax/Cpp.cpp index d05daa6..a48e7de 100644 --- a/Syntax/Cpp.cpp +++ b/Syntax/Cpp.cpp @@ -8,14 +8,24 @@ */ +//-------------------------------------------------------------------------------------------------- +// PP +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpessimizing-move" + +// Impl - std::move + +#pragma GCC diagnostic pop + #include #include #include -//-------------------------------------------------------------------------------------------------- -// PP + #define PP_VAR "pp_test" #define PP_VAR_2(x) PP_VAR "_" x //-------------------------------------------------------------------------------------------------- +using namespace std::literals::string_view_literals; // Enables the sv suffix + namespace my { int varNamespace {5}; @@ -37,7 +47,8 @@ class SyntaxCpp SyntaxCpp() = default; ~SyntaxCpp() = default; - bool fooMethod(const bool isDebug) const; + std::string_view get() const; + bool fooMethod(const bool isDebug) const; static int fooMethodStatic(bool &isDebug); @@ -45,11 +56,18 @@ class SyntaxCpp Type _type {Type::No}; int _member {0}; + static int _memberStatic; }; //-------------------------------------------------------------------------------------------------- int SyntaxCpp::_memberStatic {-1}; //-------------------------------------------------------------------------------------------------- +std::string_view +SyntaxCpp::get() const +{ + return "[SyntaxCpp]"sv; +} +//-------------------------------------------------------------------------------------------------- bool SyntaxCpp::fooMethod( const bool a_isDebug ///< [in] @@ -70,6 +88,16 @@ SyntaxCpp::fooMethodStatic( return out_isDebug ? 0 : _memberStatic; } //-------------------------------------------------------------------------------------------------- +inline std::ostream & +operator << ( + std::ostream &out_os, + const SyntaxCpp &a_value +) +{ + out_os << a_value.get(); + return out_os; +} +//-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- @@ -92,6 +120,8 @@ int main(int, char **) syntax.fooMethod(::globalVar); syntax.fooMethodStatic(::globalVar); + std::cout << syntax << std::endl; + return EXIT_SUCCESS; } //-------------------------------------------------------------------------------------------------- From e3359ec9166b867f7dbb8e86bd8d1e2084868abf Mon Sep 17 00:00:00 2001 From: skynowa Date: Mon, 14 Oct 2024 21:29:09 +0300 Subject: [PATCH 47/55] boost-stacktrace: Cpp.cpp [1+/1-] - impl --- Syntax/Cpp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Syntax/Cpp.cpp b/Syntax/Cpp.cpp index a48e7de..c9070cb 100644 --- a/Syntax/Cpp.cpp +++ b/Syntax/Cpp.cpp @@ -120,7 +120,7 @@ int main(int, char **) syntax.fooMethod(::globalVar); syntax.fooMethodStatic(::globalVar); - std::cout << syntax << std::endl; + std::cout << "SyntaxCpp: " << syntax << std::endl; return EXIT_SUCCESS; } From 1619e0c625e5449c2becbc857ecde0fe1b6a08ce Mon Sep 17 00:00:00 2001 From: skynowa Date: Fri, 25 Oct 2024 13:46:48 +0300 Subject: [PATCH 48/55] boost-stacktrace: Cpp.cpp [2+] - update --- Syntax/Cpp.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Syntax/Cpp.cpp b/Syntax/Cpp.cpp index c9070cb..26cb274 100644 --- a/Syntax/Cpp.cpp +++ b/Syntax/Cpp.cpp @@ -28,7 +28,9 @@ using namespace std::literals::string_view_literals; // Enables the sv suffix namespace my { + int varNamespace {5}; + } using namespace my; From 78cee703a38d08034f3dee1bb1b1f455e701b5ff Mon Sep 17 00:00:00 2001 From: skynowa Date: Mon, 28 Oct 2024 20:16:26 +0200 Subject: [PATCH 49/55] boost-stacktrace: Cpp.cpp [4+] - update --- Syntax/Cpp.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Syntax/Cpp.cpp b/Syntax/Cpp.cpp index 26cb274..76fdfef 100644 --- a/Syntax/Cpp.cpp +++ b/Syntax/Cpp.cpp @@ -23,6 +23,8 @@ #define PP_VAR "pp_test" #define PP_VAR_2(x) PP_VAR "_" x + +#define PP_OPERATOR_SS(x) 0; //-------------------------------------------------------------------------------------------------- using namespace std::literals::string_view_literals; // Enables the sv suffix @@ -46,6 +48,8 @@ class SyntaxCpp Yes = 1 }; + PP_OPERATOR_SS(Type); + SyntaxCpp() = default; ~SyntaxCpp() = default; From 41c4f311f824c693d1e52728add1d7c69ac7d88a Mon Sep 17 00:00:00 2001 From: skynowa Date: Mon, 28 Oct 2024 20:16:36 +0200 Subject: [PATCH 50/55] boost-stacktrace: Readme.md [10+/3-] - update --- Readme.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Readme.md b/Readme.md index 4f58a02..2c463d8 100644 --- a/Readme.md +++ b/Readme.md @@ -1,5 +1,6 @@ -# C++ Roadmap **14-Oct-2024** ![GitHub Watchers](https://img.shields.io/github/watchers/skynowa/CppTest) ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/skynowa/CppTest/CI) +# C++ Roadmap **28-Oct-2024** ![GitHub Watchers](https://img.shields.io/github/watchers/skynowa/CppTest) ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/skynowa/CppTest/CI) +- [.vscode](#.vscode "") ░░░░░░░░░░ 0.0% (0) - [Algos](#algos "Algorithms") █░░░░░░░░░ 14% (14) - [Backend](#backend "[ ] Backend skills") ░░░░░░░░░░ 0% (2) - [Build](#build "") ░░░░░░░░░░ 0.0% (0) @@ -19,12 +20,17 @@ - [PreproccessCompile](#preproccesscompile "[ ] Build: Preproccess, Compile") ░░░░░░░░░░ 0% (1) - [Python](#python "[ ] Python language skills") ████████░░ 🔥75% (4) - [Review](#review "[ ] C++ best practice") ░░░░░░░░░░ 0% (2) -- [SQL](#sql "[ ] SQL language skills") █████████░ 🚩90% (20) +- [SQL](#sql "[ ] SQL language skills") █████████░ 🚩90% (21) - [ScmCiCd](#scmcicd "SCM - Software configuration management. CI - Continuous Integration. CD - Continuous Delivery") ░░░░░░░░░░ 0% (1) - [Stl](#stl "") ███░░░░░░░ 32% (92) - [Syntax](#syntax "") ░░░░░░░░░░ 0% (1) - [Templates](#templates "[ ] Template metaprogramming") ██████░░░░ 🔥57% (14) +## .vscode ░░░░░░░░░░ 0.0% (0) + + + + ## Algos █░░░░░░░░░ 14% (14) * 🖊 `BubbleSort.cpp` @@ -1091,7 +1097,7 @@ -## SQL █████████░ 🚩90% (20) +## SQL █████████░ 🚩90% (21) * ❌ 📝 MysqlCheatSheet.md * ✅ `AnyAll.sql` @@ -1103,6 +1109,7 @@ * ✅ `Increment.sql` * ✅ `LastRecords.sql` * ✅ `GroupByHours.sql` +* ✅ `DbInfo.sql` * ❌ 📝 FAQ.md * ✅ `Duplicates.sql` * ✅ `GroupBy.sql` From 35ad3844da7cd489e77106418bfee3ecc009656a Mon Sep 17 00:00:00 2001 From: skynowa Date: Wed, 30 Oct 2024 11:41:13 +0200 Subject: [PATCH 51/55] boost-stacktrace: ToPlain.cpp [8+/6-] - impl --- Libs/NlohmannJson/ToPlain.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Libs/NlohmannJson/ToPlain.cpp b/Libs/NlohmannJson/ToPlain.cpp index ed47dca..91278de 100644 --- a/Libs/NlohmannJson/ToPlain.cpp +++ b/Libs/NlohmannJson/ToPlain.cpp @@ -19,33 +19,35 @@ jsonToPlainText( { std::string result; + const std::string nl = "\n"; + // If the current element is an object, iterate over its key-value pairs if (a_json.is_object()) { for (auto it = a_json.begin(); it != a_json.end(); ++ it) { - result += a_indent + it.key() + ":\n"; + result += a_indent + it.key() + ":" + nl; result += jsonToPlainText(it.value(), a_indent + " "); } } // If the current element is an array, iterate over its elements else if (a_json.is_array()) { - for (const auto& item : a_json) { + for (const auto &item : a_json) { if (item.is_object() || item.is_array()) { result += jsonToPlainText(item, a_indent + " "); } else if ( item.is_string() ) { - result += a_indent + " - " + item.get() + "\n"; + result += a_indent + " - " + item.get() + nl; } else { - result += a_indent + " - " + item.dump() + "\n"; + result += a_indent + " - " + item.dump() + nl; } } } // If the current element is a string, number, or boolean, print it directly else if (a_json.is_string()) { - result += a_indent + a_json.get() + "\n"; + result += a_indent + a_json.get() + nl; } else { - result += a_indent + a_json.dump() + "\n"; // For numbers and booleans + result += a_indent + a_json.dump() + nl; // For numbers and booleans } return result; From e7b1dab8016a2a35e76022f5d2f4661c5255d0ba Mon Sep 17 00:00:00 2001 From: skynowa Date: Wed, 30 Oct 2024 11:42:07 +0200 Subject: [PATCH 52/55] boost-stacktrace: Readme.md [11+/3-] - impl --- Readme.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Readme.md b/Readme.md index 2c463d8..e683c30 100644 --- a/Readme.md +++ b/Readme.md @@ -1,4 +1,4 @@ -# C++ Roadmap **28-Oct-2024** ![GitHub Watchers](https://img.shields.io/github/watchers/skynowa/CppTest) ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/skynowa/CppTest/CI) +# C++ Roadmap **30-Oct-2024** ![GitHub Watchers](https://img.shields.io/github/watchers/skynowa/CppTest) ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/skynowa/CppTest/CI) - [.vscode](#.vscode "") ░░░░░░░░░░ 0.0% (0) - [Algos](#algos "Algorithms") █░░░░░░░░░ 14% (14) @@ -11,7 +11,7 @@ - [Front](#front "[ ] Frontend skills") ░░░░░░░░░░ 0% (1) - [Idioms](#idioms "[ ] C/C++ language idioms") ████████░░ 🔥83% (47) - [IpcMt](#ipcmt "") ███░░░░░░░ 30% (30) -- [Libs](#libs "") ██████████ 🚩95% (21) +- [Libs](#libs "") ██████████ 🚩96% (23) - [Network](#network "[ ] Network") ████████░░ 🔥75% (4) - [OOP](#oop "") ░░░░░░░░░░ 0% (1) - [OS](#os "") █████████░ 🚩91% (45) @@ -805,7 +805,7 @@ -## Libs ██████████ 🚩95% (21) +## Libs ██████████ 🚩96% (23) * ❌ 📝 TODO.md * ✅ `📝 FAQ.md` @@ -854,6 +854,14 @@ + *
+ 📁 ✅ NlohmannJson 100% (2) + + * ✅ `RecursiveIterate.cpp` + * ✅ `ToPlain.cpp` + +
+ *
📁 ✅ Qt 100% (4) From cb3e7c2a84c37f8e5bfb1e259a9ea44281359667 Mon Sep 17 00:00:00 2001 From: skynowa Date: Wed, 30 Oct 2024 11:44:21 +0200 Subject: [PATCH 53/55] boost-stacktrace: ToPlain.cpp [8+/1-] - impl --- Libs/NlohmannJson/ToPlain.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Libs/NlohmannJson/ToPlain.cpp b/Libs/NlohmannJson/ToPlain.cpp index 91278de..d400ba7 100644 --- a/Libs/NlohmannJson/ToPlain.cpp +++ b/Libs/NlohmannJson/ToPlain.cpp @@ -68,7 +68,14 @@ int main(int, char **) "
  • Fee for buffet breakfast: approximately EUR 23 for adults and EUR 11.5 for children<\/li>
  • Self parking fee: EUR 22 per day<\/li>
  • Nearby parking fee: EUR 13 per day (328 ft away)<\/li>
  • Pet fee: EUR 20 per pet, per stay<\/li>
  • Service animals are exempt from fees<\/li><\/ul>", "

    The above list may not be comprehensive. Fees and deposits may not include tax and are subject to change. <\/p>" ] - } + }, + "formsOfPayment": [ + "American Express", + "Diners Club", + "JCB International", + "Mastercard", + "Visa" + ] })"; std::cout << jsonString << "\n" << std::endl; From 8ce31a743ee3f8b5c0d9601d5313249792c27198 Mon Sep 17 00:00:00 2001 From: skynowa Date: Wed, 30 Oct 2024 11:50:25 +0200 Subject: [PATCH 54/55] boost-stacktrace: ToPlain.cpp [14+/15-] - impl --- Libs/NlohmannJson/ToPlain.cpp | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/Libs/NlohmannJson/ToPlain.cpp b/Libs/NlohmannJson/ToPlain.cpp index d400ba7..98b5e3c 100644 --- a/Libs/NlohmannJson/ToPlain.cpp +++ b/Libs/NlohmannJson/ToPlain.cpp @@ -22,23 +22,23 @@ jsonToPlainText( const std::string nl = "\n"; // If the current element is an object, iterate over its key-value pairs - if (a_json.is_object()) { - for (auto it = a_json.begin(); it != a_json.end(); ++ it) { - result += a_indent + it.key() + ":" + nl; - result += jsonToPlainText(it.value(), a_indent + " "); + if ( a_json.is_object() ) { + for (auto it_node = a_json.begin(); it_node != a_json.end(); ++ it_node) { + result += a_indent + it_node.key() + ":" + nl; + result += jsonToPlainText(it_node.value(), a_indent + " "); } } // If the current element is an array, iterate over its elements - else if (a_json.is_array()) { - for (const auto &item : a_json) { - if (item.is_object() || item.is_array()) { - result += jsonToPlainText(item, a_indent + " "); + else if ( a_json.is_array() ) { + for (const auto &it_node : a_json) { + if (it_node.is_object() || it_node.is_array()) { + result += jsonToPlainText(it_node, a_indent + " "); } - else if ( item.is_string() ) { - result += a_indent + " - " + item.get() + nl; + else if ( it_node.is_string() ) { + result += a_indent + " - " + it_node.get() + nl; } else { - result += a_indent + " - " + item.dump() + nl; + result += a_indent + " - " + it_node.dump() + nl; } } } @@ -56,7 +56,8 @@ jsonToPlainText( int main(int, char **) { // JSON data as a string - const std::string jsonString = R"({ + const std::string jsonString = R"( + { "paymentPolicy": { "localCurrency": "EUR", "propertyFees": [ @@ -78,12 +79,10 @@ int main(int, char **) ] })"; - std::cout << jsonString << "\n" << std::endl; + std::cout << jsonString << "\n----------" << std::endl; - // Parse JSON data nlohmann::json jsonData = nlohmann::json::parse(jsonString); - // Convert JSON to plain text and print the result std::string plainText = jsonToPlainText(jsonData); std::cout << plainText << std::endl; From 08ff8143ac37446ebb0579c4bee98e91fe8818df Mon Sep 17 00:00:00 2001 From: skynowa Date: Thu, 2 Jan 2025 20:04:32 +0200 Subject: [PATCH 55/55] boost-stacktrace: Cpp.cpp [2+/2-] - --amend --- Syntax/Cpp.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Syntax/Cpp.cpp b/Syntax/Cpp.cpp index 76fdfef..0b96560 100644 --- a/Syntax/Cpp.cpp +++ b/Syntax/Cpp.cpp @@ -24,7 +24,7 @@ #define PP_VAR "pp_test" #define PP_VAR_2(x) PP_VAR "_" x -#define PP_OPERATOR_SS(x) 0; +#define PP_OPERATOR_SS(x) x //-------------------------------------------------------------------------------------------------- using namespace std::literals::string_view_literals; // Enables the sv suffix @@ -48,7 +48,7 @@ class SyntaxCpp Yes = 1 }; - PP_OPERATOR_SS(Type); + static const int op = PP_OPERATOR_SS(7); SyntaxCpp() = default; ~SyntaxCpp() = default;