From 1efbd30551a64c83dce27dfe61c2c9453f63d1d6 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 14 May 2026 23:12:24 +0200 Subject: [PATCH] Send assertion messages to sentry --- .../common/assert-fail/wrap-assert-fail.cc | 4 +++- src/libutil/include/nix/util/meson.build | 1 + src/libutil/include/nix/util/sentry.hh | 9 +++++++++ src/libutil/util.cc | 2 ++ src/nix/main.cc | 9 ++++----- 5 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 src/libutil/include/nix/util/sentry.hh diff --git a/nix-meson-build-support/common/assert-fail/wrap-assert-fail.cc b/nix-meson-build-support/common/assert-fail/wrap-assert-fail.cc index d9e34168bc97..292c57e7e4c7 100644 --- a/nix-meson-build-support/common/assert-fail/wrap-assert-fail.cc +++ b/nix-meson-build-support/common/assert-fail/wrap-assert-fail.cc @@ -1,4 +1,5 @@ #include "nix/util/error.hh" +#include "nix/util/sentry.hh" #include #include @@ -13,5 +14,6 @@ __wrap___assert_fail(const char * assertion, const char * file, unsigned int lin snprintf(buf, sizeof(buf), "Assertion '%s' failed in %s at %s:%" PRIuLEAST32, assertion, function, file, line); if (n < 0) nix::panic("Assertion failed and could not format error message"); - nix::panic(std::string_view(buf, std::min(static_cast(sizeof(buf)), n))); + nix::setSentryTag("assertion", buf); + nix::panic(buf); } diff --git a/src/libutil/include/nix/util/meson.build b/src/libutil/include/nix/util/meson.build index 6061c57c2851..381c1e6e4295 100644 --- a/src/libutil/include/nix/util/meson.build +++ b/src/libutil/include/nix/util/meson.build @@ -77,6 +77,7 @@ headers = [ config_pub_h ] + files( 'ref.hh', 'regex-combinators.hh', 'repair-flag.hh', + 'sentry.hh', 'serialise.hh', 'signals.hh', 'signature/local-keys.hh', diff --git a/src/libutil/include/nix/util/sentry.hh b/src/libutil/include/nix/util/sentry.hh new file mode 100644 index 000000000000..8da0fe867517 --- /dev/null +++ b/src/libutil/include/nix/util/sentry.hh @@ -0,0 +1,9 @@ +#pragma once + +#include "nix/util/fun.hh" + +namespace nix { + +extern fun setSentryTag; + +} diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 6e84f448edfd..14cdec31801b 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -307,4 +307,6 @@ std::pair getLine(std::string_view s) } } +fun setSentryTag = [](const char *, const char *) {}; + } // namespace nix diff --git a/src/nix/main.cc b/src/nix/main.cc index 2356bc4a487c..4758ca1082fc 100644 --- a/src/nix/main.cc +++ b/src/nix/main.cc @@ -23,6 +23,7 @@ #include "nix/flake/flake.hh" #include "nix/flake/settings.hh" #include "nix/util/json-utils.hh" +#include "nix/util/sentry.hh" #include "self-exe.hh" #include "crash-handler.hh" @@ -420,7 +421,8 @@ void mainWrapped(int argc, char ** argv) sentry_options_set_auto_session_tracking(options, false); sentry_options_set_handler_path(options, CRASHPAD_HANDLER_PATH); sentry_init(options); - sentry_set_tag("nix_command", argc > 0 ? std::string(baseNameOf(argv[0])).c_str() : ""); + setSentryTag = [](const char * key, const char * value) { sentry_set_tag(key, value); }; + setSentryTag("nix_command", argc > 0 ? std::string(baseNameOf(argv[0])).c_str() : ""); sentryEnabled = true; } @@ -629,10 +631,7 @@ void mainWrapped(int argc, char ** argv) evalSettings.pureEval = false; } -#if HAVE_SENTRY - if (sentryEnabled) - sentry_set_tag("nix_subcommand", concatStringsSep(" ", subcommand).c_str()); -#endif + setSentryTag("nix_subcommand", concatStringsSep(" ", subcommand).c_str()); try { args.command->second->run();