diff --git a/CMakeLists.txt b/CMakeLists.txt index 0dcba1b2..24b131af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,6 +36,9 @@ option(ENABLE_FLAC "build with FLAC support" ON) option(ENABLE_RICEPP "build with RICEPP compression support" ON) option(WITH_UNIVERSAL_BINARY "build with universal binary" ON) option(WITH_PXATTR "build with pxattr binary" OFF) +if(NOT (APPLE OR WIN32)) + option(ENABLE_STACKTRACE "build with symbolizer support" ON) +endif() if(APPLE) option(USE_HOMEBREW_LIBARCHIVE "use libarchive from homebrew" ON) 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/concurrency/CacheLocality.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/Futex.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 ) +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 ${CMAKE_CURRENT_SOURCE_DIR}/folly/folly/Benchmark.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_BUILTIN_MANPAGE ${WITH_MAN_OPTION}) set(DWARFS_PERFMON_ENABLED ${ENABLE_PERFMON}) +set(DWARFS_STACKTRACE_ENABLED ${ENABLE_STACKTRACE}) configure_file(cmake/config.h.in include/dwarfs/config.h @ONLY) foreach(tgt dwarfs_common dwarfs_reader dwarfs_writer @@ -1401,7 +1410,7 @@ if(STATIC_BUILD_DO_NOT_USE OR APPLE) if(APPLE) add_custom_target(strip COMMAND strip ${FILES_TO_STRIP}) else() - add_custom_target(strip COMMAND strip --strip-debug ${FILES_TO_STRIP}) + add_custom_target(strip COMMAND strip $,--strip-debug,--strip-all> ${FILES_TO_STRIP}) endif() endif() diff --git a/cmake/config.h.in b/cmake/config.h.in index ced801d3..13346d1b 100644 --- a/cmake/config.h.in +++ b/cmake/config.h.in @@ -10,3 +10,4 @@ #cmakedefine DWARFS_USE_JEMALLOC 1 #cmakedefine DWARFS_BUILTIN_MANPAGE 1 #cmakedefine DWARFS_PERFMON_ENABLED 1 +#cmakedefine DWARFS_STACKTRACE_ENABLED 1 diff --git a/src/dwarfs/logger.cpp b/src/dwarfs/logger.cpp index 738e0911..c9519c51 100644 --- a/src/dwarfs/logger.cpp +++ b/src/dwarfs/logger.cpp @@ -28,11 +28,14 @@ #include #include -#ifndef NDEBUG -#include -#define DWARFS_SYMBOLIZE (FOLLY_HAVE_ELF && FOLLY_HAVE_DWARF) -#else -#define DWARFS_SYMBOLIZE 0 +#include + +#ifdef DWARFS_STACKTRACE_ENABLED +#include + +#if !(FOLLY_USE_SYMBOLIZER && FOLLY_HAVE_DWARF && FOLLY_HAVE_ELF) +#error "folly symbolizer is unavailable" +#endif #endif #include @@ -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::vector 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) { oss << l << newline; } diff --git a/src/dwarfs/tool/safe_main.cpp b/src/dwarfs/tool/safe_main.cpp index bcd9ffd0..c6171d24 100644 --- a/src/dwarfs/tool/safe_main.cpp +++ b/src/dwarfs/tool/safe_main.cpp @@ -23,7 +23,11 @@ #include #include -#include +#include + +#ifdef DWARFS_STACKTRACE_ENABLED +#include +#endif #include #include @@ -34,7 +38,7 @@ namespace dwarfs::tool { int safe_main(std::function fn) { try { -#ifndef _WIN32 +#ifdef DWARFS_STACKTRACE_ENABLED folly::symbolizer::installFatalSignalHandler(); #endif setup_default_locale(); diff --git a/src/dwarfs_main.cpp b/src/dwarfs_main.cpp index 7d8291d9..dbf42d5d 100644 --- a/src/dwarfs_main.cpp +++ b/src/dwarfs_main.cpp @@ -47,7 +47,11 @@ #include -#include +#include + +#ifdef DWARFS_STACKTRACE_ENABLED +#include +#endif #ifndef DWARFS_FUSE_LOWLEVEL #define DWARFS_FUSE_LOWLEVEL 1 @@ -82,7 +86,6 @@ #define DWARFS_FSP_COMPAT #endif -#include #include #include #include @@ -1513,9 +1516,11 @@ int dwarfs_main(int argc, sys_char** argv, iolayer const& iol) { return userdata.opts.is_help ? 0 : 1; } +#ifdef DWARFS_STACKTRACE_ENABLED if (fuse_opts.foreground) { folly::symbolizer::installFatalSignalHandler(); } +#endif bool foreground = fuse_opts.foreground; #else @@ -1533,9 +1538,11 @@ int dwarfs_main(int argc, sys_char** argv, iolayer const& iol) { return userdata.opts.is_help ? 0 : 1; } +#ifdef DWARFS_STACKTRACE_ENABLED if (fg) { folly::symbolizer::installFatalSignalHandler(); } +#endif bool foreground = fg; #endif