aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/zenserver.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-05-02 14:55:55 +0200
committerGitHub <[email protected]>2023-05-02 14:55:55 +0200
commitfad0af736119be61221b03cc6529b11a42a59d71 (patch)
tree928bf057e011819a34a55e3a84891744cd554277 /src/zenserver/zenserver.cpp
parentv0.2.8-pre1 (diff)
downloadzen-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.cpp49
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