diff options
| author | Dan Engelbrecht <[email protected]> | 2023-05-02 14:55:55 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-05-02 14:55:55 +0200 |
| commit | fad0af736119be61221b03cc6529b11a42a59d71 (patch) | |
| tree | 928bf057e011819a34a55e3a84891744cd554277 /src/zenserver/zenserver.cpp | |
| parent | v0.2.8-pre1 (diff) | |
| download | zen-fad0af736119be61221b03cc6529b11a42a59d71.tar.xz zen-fad0af736119be61221b03cc6529b11a42a59d71.zip | |
Report asserts to Sentry (#267)
* don't do sentry operations if sentry init failed
* changelog
Diffstat (limited to 'src/zenserver/zenserver.cpp')
| -rw-r--r-- | src/zenserver/zenserver.cpp | 49 |
1 files changed, 40 insertions, 9 deletions
diff --git a/src/zenserver/zenserver.cpp b/src/zenserver/zenserver.cpp index 9c79f9997..03c44c0ca 100644 --- a/src/zenserver/zenserver.cpp +++ b/src/zenserver/zenserver.cpp @@ -149,6 +149,26 @@ namespace utils { } void flush_() override {} }; + + struct SentryAssertImpl : AssertImpl + { + ZEN_FORCENOINLINE ZEN_DEBUG_SECTION SentryAssertImpl() : PrevAssertImpl(CurrentAssertImpl) { CurrentAssertImpl = this; } + virtual ZEN_FORCENOINLINE ZEN_DEBUG_SECTION ~SentryAssertImpl() { CurrentAssertImpl = PrevAssertImpl; } + virtual void ZEN_FORCENOINLINE ZEN_DEBUG_SECTION OnAssert(const char* Filename, + int LineNumber, + const char* FunctionName, + const char* Msg) + { + std::string Message = fmt::format("ASSERT {}:({}) [{}]\n\"{}\"", Filename, LineNumber, FunctionName, Msg); + sentry_value_t event = sentry_value_new_message_event( + /* level */ SENTRY_LEVEL_ERROR, + /* logger */ nullptr, + /* message */ Message.c_str()); + sentry_event_value_add_stacktrace(event, NULL, 0); + sentry_capture_event(event); + } + AssertImpl* PrevAssertImpl; + }; #endif asio::error_code ResolveHostname(asio::io_context& Ctx, @@ -945,16 +965,18 @@ int ZenEntryPoint::Run() { #if ZEN_USE_SENTRY - std::string SentryDatabasePath = PathToUtf8(m_ServerOptions.DataDir / ".sentry-native"); - int SentryErrorCode = 0; + int SentryErrorCode = 0; + std::unique_ptr<zen::utils::SentryAssertImpl> SentryAssert; + if (m_ServerOptions.NoSentry == false) { - sentry_options_t* SentryOptions = sentry_options_new(); - sentry_options_set_dsn(SentryOptions, "https://[email protected]/5919284"); + std::string SentryDatabasePath = PathToUtf8(m_ServerOptions.DataDir / ".sentry-native"); if (SentryDatabasePath.starts_with("\\\\?\\")) { SentryDatabasePath = SentryDatabasePath.substr(4); } + sentry_options_t* SentryOptions = sentry_options_new(); + sentry_options_set_dsn(SentryOptions, "https://[email protected]/5919284"); sentry_options_set_database_path(SentryOptions, SentryDatabasePath.c_str()); sentry_options_set_logger(SentryOptions, SentryLogFunction, this); std::string SentryAttachmentPath = m_ServerOptions.AbsLogFile.string(); @@ -968,13 +990,22 @@ ZenEntryPoint::Run() SentryErrorCode = sentry_init(SentryOptions); - auto SentrySink = spdlog::create<utils::sentry_sink>("sentry"); - zen::logging::SetErrorLog(std::move(SentrySink)); + if (SentryErrorCode == 0) + { + auto SentrySink = spdlog::create<utils::sentry_sink>("sentry"); + zen::logging::SetErrorLog(std::move(SentrySink)); + + SentryAssert = std::make_unique<zen::utils::SentryAssertImpl>(); + } } - auto _ = zen::MakeGuard([] { - zen::logging::SetErrorLog(std::shared_ptr<spdlog::logger>()); - sentry_close(); + auto _ = zen::MakeGuard([&SentryAssert, SentryErrorCode] { + if (SentryErrorCode == 0) + { + SentryAssert.reset(); + zen::logging::SetErrorLog(std::shared_ptr<spdlog::logger>()); + sentry_close(); + } }); #endif |