Repository navigation
Conversation
Run CI on `v1` like on `master`, and dispatch console compatibility checks to the same-named console branch for commits cut from `v1`.
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## master #2196 +/- ##
==========================================
+ Coverage 75.46% 75.65% +0.18%
==========================================
Files 103 103
Lines 28220 28707 +487
Branches 5170 5294 +124
==========================================
+ Hits 21297 21718 +421
- Misses 5578 5624 +46
- Partials 1345 1365 +20 🚀 New features to boost your workflow:
|
The collective PR runs CI on every push to v1 already.
Pull request analyses are stored against the merge ref, so PRs into v1 had no baseline and compared against master.
Set CMake [`VERSION`](https://cmake.org/cmake/help/latest/prop_tgt/VERSION.html) and [`SOVERSION`](https://cmake.org/cmake/help/latest/prop_tgt/SOVERSION.html) properties. Close: #1428
* ci: include version in the release archive name Fixes: #745 * ci: keep a stable archive name for latest downloads Create a `sentry-native.zip` copy for the GCS `latest/` path so each release replaces the same object. Keep versioned archive names for GitHub and version-specific GCS paths.
BREAKING CHANGE: Linux, macOS, and Windows builds now default to the `native` backend instead of `crashpad`.
The custom capture hook required private SDK types, while screenshot options were still experimental. BREAKING CHANGE: Implement sentry_screenshot_capture(const char *, uint32_t), returning 0 on success.
The factory used a private-style `sentry__`-prefixed name even though custom transports must provide its implementation. Give it a public-style name and document the contract for custom implementations. BREAKING CHANGE: Custom transport implementations must define: ``` sentry_transport_t *sentry_transport_new_default(void) ```
Keep the scope write lock across a batch while allowing the owning thread to use existing scope accessors without relocking. Defer backend scope flushes until the outermost batch completes.
Split the existing global scope into an internal, read-only global scope for SDK/OS metadata and configured defaults, and a mutable isolation scope used by top-level APIs. Move user data, observers, and backend flushing to the isolation scope. Add `sentry_scope_acquire()` and `sentry_scope_release()` for direct isolation scope access. Implement Sentry's three-scope model with global -> isolation -> local scope layering. Retain parent references and merge layers when preparing events, telemetry, and attachments. Local values take precedence over isolation and global defaults. The SDK follows the global mode used by other Sentry SDKs for client applications: all threads share the same process-wide isolation scope. Changes made through top-level APIs or an acquired reference are shared across all threads. See: - https://develop.sentry.dev/sdk/foundations/state-management/scopes/#isolation-scope
Provide exception metadata, registers, and a basic crashing-thread stack for crash identification in native `on_crash`, matching `inproc`. Use the same payload for `before_send` when `on_crash` is unset. - Capture up to 128 fault-context IPs and unwind source in shared memory. Retain the faulting IP when available. - Linux: SDK `libunwind` with signal-safe logging. - macOS: SDK frame-pointer walker, guarded Mach reads, PAC stripping, `__DARWIN_OPAQUE_ARM_THREAD_STATE64` accessors, and `instruction_addr_adjustment=none`. - Android/Linux without `libunwind`: bounded frame-pointer capture via `process_vm_readv`; avoids `libunwindstack`'s C++ allocation. - Windows: MSVC x64 `RtlLookupFunctionEntry`/`RtlVirtualUnwind` walking without DbgHelp; SP progress permits recursive frames. Frame-pointer capture on x86/ARM64 and other x64 builds. - ARM32 frame-pointer fallbacks retain only the faulting IP. The daemon reuses partial captures and enriches existing frames. Preserve exception/register/frame edits and removals, and honor callback rejection.
| ctx, build_registers_from_ctx(ctx, SIZE_MAX)); | ||
| enrich_stacktrace(ctx, captured); | ||
| return captured; | ||
| } |
There was a problem hiding this comment.
Capture skips daemon stack walk
High Severity
A local capture with only the fault IP now wins over the daemon stack walk. The handler always stores that IP first, so a failed unwind still counts as a capture. The daemon then returns that one-frame stack and never runs remote unwind. Because the crashing process now writes the exception up front, the daemon only enriches it and the crashing thread can ship without callers.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit bcbca11. Configure here.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
There are 2 total unresolved issues (including 1 from previous review).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit cc54b28. Configure here.
| : capture->frame_pointer ? "fp" | ||
| : "cfi")); | ||
| sentry_value_append(frames, frame); | ||
| } |
There was a problem hiding this comment.
Zero IP frames kept in captures
Medium Severity
sentry__crash_context_build_stacktrace emits every captured address, including 0. When the fault IP is null, capture_stack keeps that zero entry and appends frame-pointer callers onto it. The old daemon path dropped frame_ip == 0 frames, so crash events can now include a bogus 0x0 instruction address that breaks symbolication.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit cc54b28. Configure here.


Warning
WIP 🚧🔨⏳⛔
Close: #2044
#skip-changelog (WIP)