'Generic Commit'
All checks were successful
dropshell-build / build (push) Successful in 23s

This commit is contained in:
Your Name 2025-06-03 23:58:52 +12:00
parent 5d2ee141d1
commit 5014603a42
3 changed files with 39 additions and 12 deletions

View File

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

View File

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

View File

@ -6,6 +6,19 @@
#include <cxxabi.h>
#include <libunwind.h>
#include <dlfcn.h>
#include <cstring>
#include <memory>
// 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<void*>(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 << " 0x" << std::hex << pc << ": [unknown]\n";
std::cerr << sym << " + 0x" << std::hex << offset;
}
std::cerr << " [0x" << std::hex << pc << "]\n";
} else {
std::cerr << "[unknown] [0x" << std::hex << pc << "]\n";
}
}
}