refactor: clean up symbolizer support and add ENABLE_STACKTRACE option

This commit is contained in:
Marcus Holland-Moritz 2024-08-06 12:42:22 +02:00
parent 0bac595e7a
commit bfd0256011
5 changed files with 49 additions and 25 deletions

View File

@ -36,6 +36,9 @@ option(ENABLE_FLAC "build with FLAC support" ON)
option(ENABLE_RICEPP "build with RICEPP compression support" ON) option(ENABLE_RICEPP "build with RICEPP compression support" ON)
option(WITH_UNIVERSAL_BINARY "build with universal binary" ON) option(WITH_UNIVERSAL_BINARY "build with universal binary" ON)
option(WITH_PXATTR "build with pxattr binary" OFF) option(WITH_PXATTR "build with pxattr binary" OFF)
if(NOT (APPLE OR WIN32))
option(ENABLE_STACKTRACE "build with symbolizer support" ON)
endif()
if(APPLE) if(APPLE)
option(USE_HOMEBREW_LIBARCHIVE "use libarchive from homebrew" ON) option(USE_HOMEBREW_LIBARCHIVE "use libarchive from homebrew" ON)
endif() endif()
@ -417,19 +420,6 @@ add_library(dwarfs_folly_lite OBJECT
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/String.cpp ${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/String.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/concurrency/CacheLocality.cpp ${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/concurrency/CacheLocality.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/container/detail/F14Table.cpp ${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/container/detail/F14Table.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/Dwarf.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/DwarfImpl.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/DwarfLineNumberVM.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/DwarfSection.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/DwarfUtil.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/Elf.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/ElfCache.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/LineReader.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/SignalHandler.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/StackTrace.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/SymbolizePrinter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/SymbolizedFrame.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/Symbolizer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/detail/FileUtilDetail.cpp ${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/detail/FileUtilDetail.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/detail/Futex.cpp ${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/detail/Futex.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/detail/RangeCommon.cpp ${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/detail/RangeCommon.cpp
@ -475,6 +465,24 @@ add_library(dwarfs_folly_lite OBJECT
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/tracing/AsyncStack.cpp ${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/tracing/AsyncStack.cpp
) )
if(ENABLE_STACKTRACE)
target_sources(dwarfs_folly_lite PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/Dwarf.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/DwarfImpl.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/DwarfLineNumberVM.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/DwarfSection.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/DwarfUtil.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/Elf.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/ElfCache.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/LineReader.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/SignalHandler.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/StackTrace.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/SymbolizePrinter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/SymbolizedFrame.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/debugging/symbolizer/Symbolizer.cpp
)
endif()
list(APPEND FOLLY_BENCHMARK_LITE_SRC list(APPEND FOLLY_BENCHMARK_LITE_SRC
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/Benchmark.cpp ${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/Benchmark.cpp
${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/Format.cpp ${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/Format.cpp
@ -1066,6 +1074,7 @@ set(DWARFS_HAVE_LIBBROTLI ${LIBBROTLIDEC_FOUND} AND ${LIBBROTLIENC_FOUND})
set(DWARFS_HAVE_FLAC ${FLAC_FOUND}) set(DWARFS_HAVE_FLAC ${FLAC_FOUND})
set(DWARFS_BUILTIN_MANPAGE ${WITH_MAN_OPTION}) set(DWARFS_BUILTIN_MANPAGE ${WITH_MAN_OPTION})
set(DWARFS_PERFMON_ENABLED ${ENABLE_PERFMON}) set(DWARFS_PERFMON_ENABLED ${ENABLE_PERFMON})
set(DWARFS_STACKTRACE_ENABLED ${ENABLE_STACKTRACE})
configure_file(cmake/config.h.in include/dwarfs/config.h @ONLY) configure_file(cmake/config.h.in include/dwarfs/config.h @ONLY)
foreach(tgt dwarfs_common dwarfs_reader dwarfs_writer foreach(tgt dwarfs_common dwarfs_reader dwarfs_writer
@ -1401,7 +1410,7 @@ if(STATIC_BUILD_DO_NOT_USE OR APPLE)
if(APPLE) if(APPLE)
add_custom_target(strip COMMAND strip ${FILES_TO_STRIP}) add_custom_target(strip COMMAND strip ${FILES_TO_STRIP})
else() else()
add_custom_target(strip COMMAND strip --strip-debug ${FILES_TO_STRIP}) add_custom_target(strip COMMAND strip $<IF:$<BOOL:ENABLE_STACKTRACE>,--strip-debug,--strip-all> ${FILES_TO_STRIP})
endif() endif()
endif() endif()

View File

@ -10,3 +10,4 @@
#cmakedefine DWARFS_USE_JEMALLOC 1 #cmakedefine DWARFS_USE_JEMALLOC 1
#cmakedefine DWARFS_BUILTIN_MANPAGE 1 #cmakedefine DWARFS_BUILTIN_MANPAGE 1
#cmakedefine DWARFS_PERFMON_ENABLED 1 #cmakedefine DWARFS_PERFMON_ENABLED 1
#cmakedefine DWARFS_STACKTRACE_ENABLED 1

View File

@ -28,11 +28,14 @@
#include <folly/String.h> #include <folly/String.h>
#include <folly/small_vector.h> #include <folly/small_vector.h>
#ifndef NDEBUG #include <dwarfs/config.h>
#include <folly/experimental/symbolizer/Symbolizer.h>
#define DWARFS_SYMBOLIZE (FOLLY_HAVE_ELF && FOLLY_HAVE_DWARF) #ifdef DWARFS_STACKTRACE_ENABLED
#else #include <folly/debugging/symbolizer/Symbolizer.h>
#define DWARFS_SYMBOLIZE 0
#if !(FOLLY_USE_SYMBOLIZER && FOLLY_HAVE_DWARF && FOLLY_HAVE_ELF)
#error "folly symbolizer is unavailable"
#endif
#endif #endif
#include <fmt/chrono.h> #include <fmt/chrono.h>
@ -164,7 +167,7 @@ void stream_logger::write(level_type level, const std::string& output,
} }
} }
#if DWARFS_SYMBOLIZE #ifdef DWARFS_STACKTRACE_ENABLED
std::string stacktrace; std::string stacktrace;
std::vector<std::string_view> st_lines; std::vector<std::string_view> st_lines;
@ -229,7 +232,7 @@ void stream_logger::write(level_type level, const std::string& output,
} }
} }
#if DWARFS_SYMBOLIZE #ifdef DWARFS_STACKTRACE_ENABLED
for (auto l : st_lines) { for (auto l : st_lines) {
oss << l << newline; oss << l << newline;
} }

View File

@ -23,7 +23,11 @@
#include <cstdlib> #include <cstdlib>
#include <iostream> #include <iostream>
#include <folly/experimental/symbolizer/SignalHandler.h> #include <dwarfs/config.h>
#ifdef DWARFS_STACKTRACE_ENABLED
#include <folly/debugging/symbolizer/SignalHandler.h>
#endif
#include <dwarfs/error.h> #include <dwarfs/error.h>
#include <dwarfs/terminal.h> #include <dwarfs/terminal.h>
@ -34,7 +38,7 @@ namespace dwarfs::tool {
int safe_main(std::function<int(void)> fn) { int safe_main(std::function<int(void)> fn) {
try { try {
#ifndef _WIN32 #ifdef DWARFS_STACKTRACE_ENABLED
folly::symbolizer::installFatalSignalHandler(); folly::symbolizer::installFatalSignalHandler();
#endif #endif
setup_default_locale(); setup_default_locale();

View File

@ -47,7 +47,11 @@
#include <fmt/format.h> #include <fmt/format.h>
#include <folly/experimental/symbolizer/SignalHandler.h> #include <dwarfs/config.h>
#ifdef DWARFS_STACKTRACE_ENABLED
#include <folly/debugging/symbolizer/SignalHandler.h>
#endif
#ifndef DWARFS_FUSE_LOWLEVEL #ifndef DWARFS_FUSE_LOWLEVEL
#define DWARFS_FUSE_LOWLEVEL 1 #define DWARFS_FUSE_LOWLEVEL 1
@ -82,7 +86,6 @@
#define DWARFS_FSP_COMPAT #define DWARFS_FSP_COMPAT
#endif #endif
#include <dwarfs/config.h>
#include <dwarfs/conv.h> #include <dwarfs/conv.h>
#include <dwarfs/error.h> #include <dwarfs/error.h>
#include <dwarfs/file_stat.h> #include <dwarfs/file_stat.h>
@ -1513,9 +1516,11 @@ int dwarfs_main(int argc, sys_char** argv, iolayer const& iol) {
return userdata.opts.is_help ? 0 : 1; return userdata.opts.is_help ? 0 : 1;
} }
#ifdef DWARFS_STACKTRACE_ENABLED
if (fuse_opts.foreground) { if (fuse_opts.foreground) {
folly::symbolizer::installFatalSignalHandler(); folly::symbolizer::installFatalSignalHandler();
} }
#endif
bool foreground = fuse_opts.foreground; bool foreground = fuse_opts.foreground;
#else #else
@ -1533,9 +1538,11 @@ int dwarfs_main(int argc, sys_char** argv, iolayer const& iol) {
return userdata.opts.is_help ? 0 : 1; return userdata.opts.is_help ? 0 : 1;
} }
#ifdef DWARFS_STACKTRACE_ENABLED
if (fg) { if (fg) {
folly::symbolizer::installFatalSignalHandler(); folly::symbolizer::installFatalSignalHandler();
} }
#endif
bool foreground = fg; bool foreground = fg;
#endif #endif