From 5014603a426cfbdade8d719327ecbf8dc330f1bc Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 3 Jun 2025 23:58:52 +1200 Subject: [PATCH] 'Generic Commit' --- Dockerfile.dropshell-build | 9 +++++++-- ipdemo/CMakeLists.txt | 7 +++---- ipdemo/src/assert.hpp | 35 +++++++++++++++++++++++++++++------ 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/Dockerfile.dropshell-build b/Dockerfile.dropshell-build index b251629..b0c978e 100644 --- a/Dockerfile.dropshell-build +++ b/Dockerfile.dropshell-build @@ -22,12 +22,17 @@ RUN apk add --no-cache \ libunwind \ libunwind-dev \ libunwind-static \ - libunwind-dbg \ zlib-dev \ zlib-static \ + xz \ xz-dev \ xz-static \ - xz-libs + xz-libs \ + libdwarf \ + libdwarf-dev \ + elfutils \ + elfutils-dev \ + elfutils-libelf #RUN apk add --no-cache --update --repository=https://dl-cdn.alpinelinux.org/alpine/v3.16/main/ libexecinfo-dev diff --git a/ipdemo/CMakeLists.txt b/ipdemo/CMakeLists.txt index 570139f..13c5e1c 100644 --- a/ipdemo/CMakeLists.txt +++ b/ipdemo/CMakeLists.txt @@ -84,14 +84,13 @@ FetchContent_MakeAvailable(nlohmann_json) find_package(PkgConfig REQUIRED) pkg_check_modules(LIBUNWIND REQUIRED IMPORTED_TARGET libunwind) -# Additional required libraries for static linking +# Required libraries for basic stack tracing set(EXTRA_LIBS ${LIBUNWIND_LIBRARIES} -lunwind -lunwind-x86_64 - -llzma - -lz - -ldl + -llzma # Required by libunwind for debug info + -ldl # For dladdr ) # Link libraries diff --git a/ipdemo/src/assert.hpp b/ipdemo/src/assert.hpp index b35d70f..24bb2b8 100644 --- a/ipdemo/src/assert.hpp +++ b/ipdemo/src/assert.hpp @@ -6,6 +6,19 @@ #include #include #include +#include +#include + +// Simple RAII wrapper for file descriptor +class FileDescriptor { + int fd_ = -1; +public: + explicit FileDescriptor(int fd) : fd_(fd) {} + ~FileDescriptor() { if (fd_ != -1) close(fd_); } + operator int() const { return fd_; } + FileDescriptor(const FileDescriptor&) = delete; + FileDescriptor& operator=(const FileDescriptor&) = delete; +}; void print_stacktrace() { unw_cursor_t cursor; @@ -14,6 +27,7 @@ void print_stacktrace() { char sym[256]; char *name = sym; int status; + int frame_num = 0; // Initialize cursor to current frame unw_getcontext(&context); @@ -28,21 +42,30 @@ void print_stacktrace() { break; } + std::cerr << "#" << frame_num++ << " "; + // Get symbol name if (unw_get_proc_name(&cursor, sym, sizeof(sym), &offset) == 0) { // Demangle the C++ name - int status; + int status = 0; size_t length = sizeof(sym); name = abi::__cxa_demangle(sym, nullptr, &length, &status); - if (name == nullptr) { - name = sym; + + Dl_info info; + if (dladdr(reinterpret_cast(pc), &info) && info.dli_fname) { + std::cerr << "in " << info.dli_fname << ": "; } - std::cerr << " 0x" << std::hex << pc << ": " << name << " + 0x" << offset << "\n"; - if (name != sym) { + + if (name) { + std::cerr << name << " + 0x" << std::hex << offset; free(name); + } else { + std::cerr << sym << " + 0x" << std::hex << offset; } + + std::cerr << " [0x" << std::hex << pc << "]\n"; } else { - std::cerr << " 0x" << std::hex << pc << ": [unknown]\n"; + std::cerr << "[unknown] [0x" << std::hex << pc << "]\n"; } } }