[Crash] Add lifecycle breadcrumbs for unattributable native crashes (#7813)
Some checks are pending
CodeQL / Analyze (cpp) (push) Waiting to run
CodeQL / Analyze (actions) (push) Waiting to run
Build Desktop / Configure (push) Waiting to run
Build Desktop / vcpkg baseline (push) Waiting to run
Build Desktop / Debian 13 (push) Blocked by required conditions
Build Desktop / Fedora 45 release (push) Blocked by required conditions
Build Desktop / Fedora 45 debug (push) Blocked by required conditions
Build Desktop / Servatrice_Debian 12 (push) Blocked by required conditions
Build Desktop / Ubuntu 26.04 (push) Blocked by required conditions
Build Desktop / Arch (push) Blocked by required conditions
Build Desktop / Debian 12 (push) Blocked by required conditions
Build Desktop / Fedora 44 (push) Blocked by required conditions
Build Desktop / Ubuntu 24.04 (push) Blocked by required conditions
Build Desktop / Ubuntu 26.04 sanitize (push) Blocked by required conditions
Build Desktop / Ubuntu 26.04 cover (push) Blocked by required conditions
Build Desktop / macOS 14 (push) Blocked by required conditions
Build Desktop / macOS 15 (push) Blocked by required conditions
Build Desktop / macOS 27 Debug (push) Blocked by required conditions
Build Desktop / Windows 10 (push) Blocked by required conditions
Build Desktop / macOS 13 Intel (push) Blocked by required conditions
Build Desktop / Prune caches (push) Waiting to run
Build Docker / Servatrice (arm) (push) Waiting to run
Build Docker / Servatrice (x86) (push) Waiting to run
Build Docker / Publish multi-platform Servatrice image (push) Blocked by required conditions

* [Crash] Add lifecycle breadcrumbs for unattributable native crashes

Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>

* Restore the native split host button on non-macOS styles

The merged quick-host control composed a QPushButton and a separate autoRaise arrow QToolButton, which Fusion draws as two adjacent controls. Version one of the quick-host branch used a single QToolButton with MenuButtonPopup, which every style draws as one native split button.

Use that split button on every style that can draw one, and keep the plain primary + settings button pair as the native macOS fallback.

* Enable hover zoom and the hover panel by default

Both hover triggers now default to Hover, with the existing 400 ms zoom delay and 200 ms panel delay. The Off trigger remains available for users who want the old behavior.

---------

Co-authored-by: Lukas Brübach <44814898+BruebachL@users.noreply.github.com>
Co-authored-by: sentry[bot] <39604003+sentry[bot]@users.noreply.github.com>
This commit is contained in:
sentry[bot] 2026-11-08 23:06:21 +01:00 • committed by GitHub
parent 40ebd22549
commit 9793a0df4a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 114 additions and 73 deletions

View file

@ -614,3 +614,19 @@ QString CrashReporter::redactCockatriceUrls(const QString &line)
redacted.append(line.mid(pos));
return redacted;
}
void CrashReporter::addBreadcrumb(const char *category, const char *message)
{
#if COCKATRICE_WITH_CRASH_REPORTING
if (category == nullptr || message == nullptr) {
return;
}
sentry_value_t crumb = sentry_value_new_breadcrumb("default", message);
sentry_value_set_by_key(crumb, "category", sentry_value_new_string(category));
sentry_value_set_by_key(crumb, "level", sentry_value_new_string("info"));
sentry_add_breadcrumb(crumb);
#else
Q_UNUSED(category);
Q_UNUSED(message);
#endif
}

View file

@ -167,6 +167,17 @@ public:
static QString sanitizeLogLine(const QString &line);
static QString redactCockatriceUrls(const QString &line);
/**
* @brief Record a fixed-text lifecycle breadcrumb on the active Sentry scope.
*
* Native crashes whose stack walk loses the in-app frames (e.g. a QMap lookup
* that dies inside Qt's string comparison) otherwise arrive with no hint of
* what the client was doing. Only pass compile-time string literals: no user
* names, card names, paths or URLs, so no personal data can leak through this
* channel. Thread-safe; a no-op in OFF builds or before init().
*/
static void addBreadcrumb(const char *category, const char *message);
private:
bool ready = false;
QString sentryDatabasePath;