Skip to content

feat!: 1.0 - #2196

Open
jpnurmi wants to merge 22 commits into
masterfrom
v1
Open

jpnurmi wants to merge 22 commits into
masterfrom
v1

Conversation

@jpnurmi

@jpnurmi jpnurmi commented Oct 14, 2026 •

Copy link
Copy Markdown
Collaborator

Warning

WIP    🚧🔨⏳⛔

Close: #2044

#skip-changelog (WIP)

Run CI on `v1` like on `master`, and dispatch console compatibility
checks to the same-named console branch for commits cut from `v1`.

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread .github/workflows/console-check.yml
@codecov

codecov Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 76.04212% with 546 lines in your changes missing coverage. Please review.
✅ Project coverage is 75.54%. Comparing base (bbbd78c) to head (839f510).
⚠️ Report is 1 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #2196      +/-   ##
==========================================
- Coverage   75.61%   75.54%   -0.07%     
==========================================
  Files         103      105       +2     
  Lines       28261    29642    +1381     
  Branches     5179     5479     +300     
==========================================
+ Hits        21369    22394    +1025     
- Misses       5536     5832     +296     
- Partials     1356     1416      +60     
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

The collective PR runs CI on every push to v1 already.

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread .github/workflows/codeql.yml Outdated
Pull request analyses are stored against the merge ref, so PRs into v1
had no baseline and compared against master.
* 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)
```

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread src/sentry_options.c
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

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread src/sentry_scope.c
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.
Promote the 5-6 years old module API, also used by downstream SDKs,
now that it's usable for direct Native SDK users for comparing frame
addresses with module ranges.

Ref: #2102
Ref: #2116

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread src/backends/native/sentry_crash_daemon.c

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread src/backends/native/sentry_crash_context.h
Skip Windows frame symbol lookup when symbolize_stacktraces is
disabled, including crash frames captured before daemon processing.
Add length-prefixed frames and app-to-daemon IPC based on Unix domain
stream socket pairs and an anonymous pipe on Windows.

Ref: #1834
* perf(native): Sync scope over IPC

Instead of flushing the whole scope/event on disk on every scope
change, send an initial scope snapshot and then minimal incremental
updates to the crash daemon over IPC.

Keep the latest complete state in daemon memory for crash reports.
Discard interrupted messages and preserve crash callback changes through
a final event and attachment snapshot.

Close: #1834

* handle SENTRY_CRASH_STATE_CRASHING

* signal.h

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread src/backends/native/sentry_crash_daemon.c
Comment thread src/backends/native/sentry_crash_daemon.c
@jpnurmi jpnurmi added the v1 Targets 1.0 (v1 branch) label Oct 16, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4cef180. Configure here.

sentry_value_decref(event);
if (!event_json) {
sentry_free(event_id);
return false;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Crash envelope loses OOM fallback

High Severity

Minidump and native envelope builders now clone and reserialize the staged event and return failure if that fails. The previous path shipped the original event bytes so a crash report still left the process. Under memory pressure, clone or JSON serialization failure now drops the already-written minidump and the crash envelope entirely.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 4cef180. Configure here.

The inproc-based Android NDK uses `SENTRY_TRANSPORT=none` and installs
a JNI function transport that writes to `outbox/`, leaving HTTP delivery
to Java. Tests substitute it with an stdout callback to inspect envelopes
without Java or HTTP.

However, the Native daemon in #1725 cannot use the function transport
from the separate daemon process. Provide (an internal) built-in stdout
transport (`SENTRY_TRANSPORT=stdout`) that both the SDK and daemon can
instantiate. This is mostly for out own integration testing purposes,
but it's also super handy for quick experiments:

```sh
$ make build SENTRY_BACKEND=inproc SENTRY_TRANSPORT=stdout
...
$ ./build/sentry_example_crash
...
[sentry] DEBUG sending envelope
{"event_id":"0e1d5355-5ba8-42cb-9e96-c6610d4ee9c1",...}
{"type":"event","length":2823}
{"event_id":"0e1d5355-5ba8-42cb-9e96-c6610d4ee9c1","timestamp":"2026-10-16T16:19:26.968633Z","platform":"native","level":"fatal","exception":...}
[sentry] INFO entering signal handler
...
```
* fix(native): Reduce daemon stack usage when writing minidumps

Android e2e testing for #1725 exposed a daemon stack overflow: the roughly
1.2 MB local `minidump_writer_t` exceeds the crash service Java worker's
stack, crashing the daemon before it writes a minidump.

Allocate the writer on the heap to avoid exhausting the daemon's stack.

#1725

* consolidate cleanup_error, matching macos writer's convention
* fix(unwinder): Reduce maps buffer stack usage

#2174 brought the SDK unwinder's 4 KiB `/proc/self/maps` buffer onto
the native signal-handler stack. Use 512 bytes; preserve oversized
lines and address prefixes split across reads without new allocations.

GCC 15 `-O3`, Linux x86-64, Ryzen AI 9 HX 370:

| Measurement | 4096 B | 512 B |
| --- | ---: | ---: |
| Native handler peak (B) | 6,344 | 3,424 |
| Maps lookups, 190 KiB / 1,900 mappings (ms) | 0.406 | 0.490 |
| Maps lookups, 308 KiB / 3,053 mappings (ms) | 0.776 | 0.972 |

This saves 2,920 bytes of handler stack at the cost of more reads.
Lookup timings are warm code/stack lookup pairs: medians of nine
rotating batches, excluding unwinding and other crash handling.

* Update CHANGELOG.md

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

v1 Targets 1.0 (v1 branch)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1.0

1 participant