packages.biu: simplify backtrace

This commit is contained in:
2026-01-05 15:10:10 +08:00
parent ef8f516ab3
commit f2a9d285f3
6 changed files with 22 additions and 49 deletions

View File

@@ -13,8 +13,7 @@ endif()
find_package(magic_enum REQUIRED) find_package(magic_enum REQUIRED)
find_package(fmt REQUIRED) find_package(fmt REQUIRED)
find_package(Boost REQUIRED COMPONENTS headers iostreams filesystem system process stacktrace_from_exception find_package(Boost REQUIRED COMPONENTS headers iostreams filesystem system process)
stacktrace_backtrace)
find_package(range-v3 REQUIRED) find_package(range-v3 REQUIRED)
find_path(NAMEOF_INCLUDE_DIR nameof.hpp REQUIRED) find_path(NAMEOF_INCLUDE_DIR nameof.hpp REQUIRED)
find_package(Eigen3 REQUIRED) find_package(Eigen3 REQUIRED)
@@ -22,13 +21,12 @@ set(HIGHFIVE_FIND_HDF5 Off)
find_package(HighFive REQUIRED) find_package(HighFive REQUIRED)
find_path(ZPP_BITS_INCLUDE_DIR zpp_bits.h REQUIRED) find_path(ZPP_BITS_INCLUDE_DIR zpp_bits.h REQUIRED)
find_package(TgBot REQUIRED) find_package(TgBot REQUIRED)
find_path(LIBBACKTRACE_INCLUDE_DIR backtrace.h REQUIRED)
find_library(LIBBACKTRACE_LIBRARY NAMES backtrace REQUIRED)
find_package(HDF5 REQUIRED) find_package(HDF5 REQUIRED)
find_package(concurrencpp REQUIRED) find_package(concurrencpp REQUIRED)
find_path(POCKETFFT_INCLUDE_DIR pocketfft.h REQUIRED) find_path(POCKETFFT_INCLUDE_DIR pocketfft.h REQUIRED)
find_package(yaml-cpp REQUIRED) find_package(yaml-cpp REQUIRED)
find_package(glaze REQUIRED) find_package(glaze REQUIRED)
find_package(cpptrace REQUIRED)
add_library(biu src/common.cpp src/hdf5.cpp src/string.cpp) add_library(biu src/common.cpp src/hdf5.cpp src/string.cpp)
target_include_directories(biu PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> target_include_directories(biu PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
@@ -36,7 +34,7 @@ target_include_directories(biu PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_D
${LIBBACKTRACE_INCLUDE_DIR} ${POCKETFFT_INCLUDE_DIR}) ${LIBBACKTRACE_INCLUDE_DIR} ${POCKETFFT_INCLUDE_DIR})
target_link_libraries(biu PUBLIC magic_enum::magic_enum fmt::fmt Boost::headers Boost::iostreams Boost::filesystem target_link_libraries(biu PUBLIC magic_enum::magic_enum fmt::fmt Boost::headers Boost::iostreams Boost::filesystem
range-v3::range-v3 Eigen3::Eigen HighFive TgBot::TgBot ${LIBBACKTRACE_LIBRARY} hdf5::hdf5 concurrencpp::concurrencpp range-v3::range-v3 Eigen3::Eigen HighFive TgBot::TgBot ${LIBBACKTRACE_LIBRARY} hdf5::hdf5 concurrencpp::concurrencpp
yaml-cpp::yaml-cpp glaze::glaze Boost::process Boost::stacktrace_from_exception Boost::stacktrace_backtrace) yaml-cpp::yaml-cpp glaze::glaze Boost::process cpptrace::cpptrace)
target_compile_features(biu PUBLIC cxx_std_23) target_compile_features(biu PUBLIC cxx_std_23)
target_compile_options(biu PUBLIC -Wno-gnu-string-literal-operator-template) target_compile_options(biu PUBLIC -Wno-gnu-string-literal-operator-template)
install(TARGETS biu EXPORT biuTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} install(TARGETS biu EXPORT biuTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}

View File

@@ -1,18 +1,16 @@
include("${CMAKE_CURRENT_LIST_DIR}/biuTargets.cmake") include("${CMAKE_CURRENT_LIST_DIR}/biuTargets.cmake")
find_package(magic_enum REQUIRED) find_package(magic_enum REQUIRED)
find_package(fmt REQUIRED) find_package(fmt REQUIRED)
find_package(Boost REQUIRED COMPONENTS headers iostreams filesystem system process stacktrace_from_exception find_package(Boost REQUIRED COMPONENTS headers iostreams filesystem system process)
stacktrace_backtrace)
find_package(range-v3 REQUIRED) find_package(range-v3 REQUIRED)
find_path(NAMEOF_INCLUDE_DIR nameof.hpp REQUIRED) find_path(NAMEOF_INCLUDE_DIR nameof.hpp REQUIRED)
find_package(Eigen3 REQUIRED) find_package(Eigen3 REQUIRED)
find_package(HighFive REQUIRED) find_package(HighFive REQUIRED)
find_path(ZPP_BITS_INCLUDE_DIR zpp_bits.h REQUIRED) find_path(ZPP_BITS_INCLUDE_DIR zpp_bits.h REQUIRED)
find_package(TgBot REQUIRED) find_package(TgBot REQUIRED)
find_path(LIBBACKTRACE_INCLUDE_DIR backtrace.h REQUIRED)
find_library(LIBBACKTRACE_LIBRARY NAMES backtrace REQUIRED)
find_package(HDF5 REQUIRED) find_package(HDF5 REQUIRED)
find_package(concurrencpp REQUIRED) find_package(concurrencpp REQUIRED)
find_path(POCKETFFT_INCLUDE_DIR pocketfft.h REQUIRED) find_path(POCKETFFT_INCLUDE_DIR pocketfft.h REQUIRED)
find_package(yaml-cpp REQUIRED) find_package(yaml-cpp REQUIRED)
find_package(glaze REQUIRED) find_package(glaze REQUIRED)
find_package(cpptrace REQUIRED)

View File

@@ -1,7 +1,7 @@
{ {
stdenv, cmake, lib, stdenv, cmake, lib,
magic-enum, fmt, boost, eigen, range-v3, nameof, zpp-bits, highfive, tgbot-cpp, libbacktrace, hdf5, concurrencpp, magic-enum, fmt, boost, eigen, range-v3, nameof, zpp-bits, highfive, tgbot-cpp, libbacktrace, hdf5, concurrencpp,
pocketfft, yaml-cpp, glaze pocketfft, yaml-cpp, glaze, cpptrace
}: stdenv.mkDerivation rec }: stdenv.mkDerivation rec
{ {
name = "biu"; name = "biu";
@@ -10,6 +10,7 @@
[ [
magic-enum fmt boost range-v3 nameof zpp-bits eigen libbacktrace hdf5 magic-enum fmt boost range-v3 nameof zpp-bits eigen libbacktrace hdf5
concurrencpp pocketfft yaml-cpp glaze (highfive.override { inherit boost; }) (tgbot-cpp.override { inherit boost; }) concurrencpp pocketfft yaml-cpp glaze (highfive.override { inherit boost; }) (tgbot-cpp.override { inherit boost; })
cpptrace
]; ];
propagatedBuildInputs = buildInputs; propagatedBuildInputs = buildInputs;
nativeBuildInputs = [ cmake ]; nativeBuildInputs = [ cmake ];

View File

@@ -1,7 +1,5 @@
# pragma once # pragma once
# include <map> # include <map>
# define BOOST_STACKTRACE_USE_BACKTRACE
# include <boost/stacktrace.hpp>
# include <biu/atomic.hpp> # include <biu/atomic.hpp>
namespace biu namespace biu
@@ -85,12 +83,6 @@ namespace biu
public: [[gnu::always_inline]] inline void error(const std::string& message) const; public: [[gnu::always_inline]] inline void error(const std::string& message) const;
public: [[gnu::always_inline]] inline void info(const std::string& message) const; public: [[gnu::always_inline]] inline void info(const std::string& message) const;
public: [[gnu::always_inline]] inline void debug(const std::string& message) const; public: [[gnu::always_inline]] inline void debug(const std::string& message) const;
public: [[gnu::always_inline]] inline void print_exception
(
std::optional<std::pair<std::string, std::string>> type_and_message,
const boost::stacktrace::stacktrace& stacktrace
) const;
}; };
friend class Guard; friend class Guard;

View File

@@ -5,6 +5,8 @@
# include <biu/common.hpp> # include <biu/common.hpp>
# include <biu/format.hpp> # include <biu/format.hpp>
# include <boost/exception/diagnostic_information.hpp> # include <boost/exception/diagnostic_information.hpp>
# include <cpptrace/cpptrace.hpp>
# include <cpptrace/from_current.hpp>
namespace biu namespace biu
{ {
@@ -70,8 +72,12 @@ namespace biu
catch (...) catch (...)
{ {
log.error(boost::current_exception_diagnostic_information()); log.error(boost::current_exception_diagnostic_information());
log.print_exception if (auto&& lock = LoggerConfig_.lock(); lock->Level >= Logger::Level::Error)
(std::nullopt, boost::stacktrace::stacktrace::from_current_exception()); {
static_assert(std::same_as<std::size_t, std::uint64_t>);
cpptrace::from_current_exception().print(*lock->Stream);
*lock->Stream << std::flush;
}
} }
} }
@@ -117,13 +123,13 @@ namespace biu
{ {
static_assert(std::same_as<std::size_t, std::uint64_t>); static_assert(std::same_as<std::size_t, std::uint64_t>);
auto time = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()); auto time = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
boost::stacktrace::stacktrace stack; auto frame = cpptrace::stacktrace::current(0, 1).frames[0];
# ifdef BIU_LOGGER_SOURCE_ROOT # ifdef BIU_LOGGER_SOURCE_ROOT
auto source_root = std::string_view(BIU_LOGGER_SOURCE_ROOT "/"); auto source_root = std::string_view(BIU_LOGGER_SOURCE_ROOT "/");
auto source_file = stack[0].source_file().starts_with(source_root) ? auto source_file = frame.filename.starts_with(source_root) ?
stack[0].source_file().substr(source_root.size()) : stack[0].source_file(); frame.filename.substr(source_root.size()) : frame.filename;
# else # else
auto source_file = stack[0].source_file(); auto source_file = frame.filename;
# endif # endif
*lock->Stream << "[ {:%T} {:02x} {:02} ] {} (at {}:{} {} )\n"_f *lock->Stream << "[ {:%T} {:02x} {:02} ] {} (at {}:{} {} )\n"_f
( (
@@ -132,8 +138,8 @@ namespace biu
Indent_, Indent_,
message, message,
source_file.empty() ? "??"s : source_file, source_file.empty() ? "??"s : source_file,
stack[0].source_line() == 0 ? "??"s : "{}"_f(stack[0].source_line()), frame.line.has_value() ? "{}"_f(frame.line.value()) : "??"s,
stack[0].name() frame.symbol
) << std::flush; ) << std::flush;
} }
} }
@@ -147,26 +153,5 @@ namespace biu
return std::forward<T>(value); return std::forward<T>(value);
} }
inline void Logger::Guard::print_exception
(
std::optional<std::pair<std::string, std::string>> type_and_message,
const boost::stacktrace::stacktrace& stacktrace
) const
{
if (type_and_message) log<Level::Error>("{}: {}"_f(type_and_message->first, type_and_message->second));
if (auto&& lock = LoggerConfig_.lock(); lock->Level >= Logger::Level::Error)
{
static_assert(std::same_as<std::size_t, std::uint64_t>);
for (auto frame : stacktrace)
*lock->Stream << "\tfrom {}:{} {}\n"_f
(
frame.source_file().empty() ? "??"s : frame.source_file(),
frame.source_line() == 0 ? "??"s : "{}"_f(frame.source_line()),
frame.name()
);
*lock->Stream << std::flush;
}
}
inline Atomic<std::map<std::size_t, std::size_t>> Logger::Threads_; inline Atomic<std::map<std::size_t, std::size_t>> Logger::Threads_;
} }

View File

@@ -68,8 +68,7 @@ inputs: rec
# TODO: report glaze bug to upstream # TODO: report glaze bug to upstream
inherit (inputs.pkgs.pkgs-2411) glaze; inherit (inputs.pkgs.pkgs-2411) glaze;
stdenv = inputs.pkgs.clang18Stdenv; stdenv = inputs.pkgs.clang18Stdenv;
boost = (inputs.pkgs.boost188.override { extraB2Args = [ "boost.stacktrace.backtrace=on" ]; }).overrideAttrs boost = inputs.pkgs.boost188;
(prev: { buildInputs = prev.buildInputs ++ [(inputs.pkgs.libbacktrace.override { enableStatic = true; })]; });
fmt = inputs.pkgs.fmt_11.overrideAttrs (prev: { patches = prev.patches or [] ++ [ ./biu/fmt.patch ]; }); fmt = inputs.pkgs.fmt_11.overrideAttrs (prev: { patches = prev.patches or [] ++ [ ./biu/fmt.patch ]; });
}; };
hpcstat = inputs.pkgs.callPackage ./hpcstat hpcstat = inputs.pkgs.callPackage ./hpcstat