From 55fc83762b467e7d68a969333af6c5ec4645980b Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 29 Oct 2026 10:24:58 +0100 Subject: [PATCH 1/2] fix(grouping): Group Unity IL2CPP crashes across platforms IL2CPP compiles game, engine and BCL code into one binary whose name differs per platform (GameAssembly.*, UnityFramework, libil2cpp.so). The bundle rules marked all of it in-app on Apple platforms and none of it on Android, Windows and Linux, so the same crash became a separate issue on every platform. Keep only the frames the IL2CPP line mapping resolves to project sources in-app, and mark the engine, Unity's GameActivity glue, the iOS and macOS launch stubs and the Sentry SDK binaries as not in-app. The launch stub is matched by its call into IL2CPP or UnityPlayer, since its source path is lost when the app executable's debug file is not uploaded. Coroutine starters stop contributing, since which of them get captured differs by platform. The rules go into the current enhancements base only, so existing hashes on the legacy base are unaffected, and only the newstyle:2026-01-20 snapshots change. Co-Authored-By: Claude Opus 5.5 --- .../all-platforms@2026-01-20.txt | 48 ++++++++++++++ .../unity_coroutine_dispatch.pysnap | 19 +----- .../unity_il2cpp_android.pysnap | 32 +++++++--- .../unity_il2cpp_edge_cases.pysnap | 18 +++--- .../unity_il2cpp_ios.pysnap | 45 +------------- .../unity_il2cpp_linux.pysnap | 29 +++++++-- .../unity_il2cpp_macos.pysnap | 45 +++++++++----- .../unity_il2cpp_windows.pysnap | 29 +++++++-- .../unity_coroutine_dispatch.pysnap | 16 ++--- .../unity_il2cpp_android.pysnap | 56 ++++++++--------- .../unity_il2cpp_edge_cases.pysnap | 24 +++---- .../unity_il2cpp_ios.pysnap | 44 ++++++------- .../unity_il2cpp_linux.pysnap | 54 ++++++++-------- .../unity_il2cpp_macos.pysnap | 62 +++++++++---------- .../unity_il2cpp_windows.pysnap | 52 ++++++++-------- .../unity_coroutine_dispatch.pysnap | 10 +-- .../unity_il2cpp_android.pysnap | 40 ++++++------ .../unity_il2cpp_edge_cases.pysnap | 16 ++--- .../unity_il2cpp_ios.pysnap | 26 ++++---- .../unity_il2cpp_linux.pysnap | 40 ++++++------ .../unity_il2cpp_macos.pysnap | 38 ++++++------ .../unity_il2cpp_windows.pysnap | 38 ++++++------ 22 files changed, 422 insertions(+), 359 deletions(-) diff --git a/src/sentry/grouping/enhancer/enhancement-configs/all-platforms@2026-01-20.txt b/src/sentry/grouping/enhancer/enhancement-configs/all-platforms@2026-01-20.txt index c37675f898d3..cdd3270207f3 100644 --- a/src/sentry/grouping/enhancer/enhancement-configs/all-platforms@2026-01-20.txt +++ b/src/sentry/grouping/enhancer/enhancement-configs/all-platforms@2026-01-20.txt @@ -186,6 +186,15 @@ module:cn.gundam.sdk.* category=telemetry module:com.lenovo.payplus.analytics.* category=telemetry package:"**/libBugly.so" category=telemetry +## Unity ships the Sentry SDK under a different name on each platform, none of them the embedded +## `Sentry.framework` covered by the support-framework rules below +family:native package:**/PlugIns/Sentry.* category=telemetry +family:native package:**/PlugIns/libsentry.* category=telemetry +family:native package:**/SentryObjC.framework/** category=telemetry +family:native package:**/libsentry.so category=telemetry +family:native package:**/libsentry-android.so category=telemetry +family:native package:**/sentry.dll category=telemetry + family:native function:dlopen category=load family:native function:dladdr category=load family:native function:ImageLoaderMachO::findClosestSymbol category=load @@ -299,6 +308,45 @@ family:native package:**/Containers/Bundle/Application/** +app family:native package:**.app/Contents/** +app family:native package:/Users/** +app +# Unity IL2CPP compiles game, engine and BCL code into one binary, so the bundle rules above would +# mark all of it in-app. Only frames the IL2CPP line mapping resolved back to project sources are the +# developer's; anything left in generated `il2cppOutput/cpp/*.cpp` is engine, BCL or runtime code. +# `Assets/` and `Packages/` are not Unity-specific, so the restores are scoped to the binary. +family:native package:**/GameAssembly.* category=il2cpp +family:native package:**/UnityFramework category=il2cpp +family:native package:**/libil2cpp.so category=il2cpp +category:il2cpp -app + +category:il2cpp path:**/Assets/** +app +category:il2cpp path:**/Packages/** +app +## Unity's engine C# ships its sources under an `Assets` directory of its own, and registry packages +## are third-party but escape the restore above only by UPM convention (sources under `Runtime/`). +category:il2cpp path:**/unity/Modules/** -app +category:il2cpp path:**/Library/PackageCache/** -app + +## The engine, which never contains game code +family:native package:**/UnityPlayer.* category=framework +family:native package:**/libunity.so category=framework +family:native package:**/libiPhone-lib.dylib category=framework +family:native package:**/UnityRuntime.framework/** category=framework +## Unity's Android GameActivity glue. `libgame` is also a natural name for a developer's own NDK +## library, so the file name alone does not identify Unity. +family:native package:**/libgame.so path:**/unityLibrary/src/main/cpp/GameActivity/** category=framework +family:native package:**/libgame.so function:Unity::* category=framework +family:native package:**/libgame.so function:MainLoop category=framework + +## Unity's launch stubs on iOS and macOS: template code rather than anything the developer wrote, +## and the bundle rules above mark it in-app on those platforms only, which splits an otherwise +## identical crash from its counterparts. Its source path is lost when the app executable's debug +## file is not uploaded; its call into the engine is not. +family:native function:main | [ category:il2cpp ] -app +family:native function:main | [ package:**/UnityPlayer.* ] -app + +# Unity dispatches coroutines from its own scheduler, so the frames below `InvokeMoveNext` are +# whoever started the coroutine rather than the caller that threw. Which of them get captured +# differs by platform, splitting one crash into several issues. +family:other package:UnityEngine.CoreModule* function:InvokeMoveNext v-group + # Unreal Engine ## UE internal fatal log message handling diff --git a/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_coroutine_dispatch.pysnap b/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_coroutine_dispatch.pysnap index bebeaf0cada8..dd78348f1dd9 100644 --- a/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_coroutine_dispatch.pysnap +++ b/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_coroutine_dispatch.pysnap @@ -22,7 +22,7 @@ metrics with tags: { --- contributing variants: app* - hash: "31cfc54cd60b693b789568c5ec9278e2" + hash: "04eb3e30c44355bca4f760682c7b6198" contributing component: exception hint: None root_component: @@ -31,11 +31,6 @@ contributing variants: type* "System.NullReferenceException" stacktrace* - frame* (marked in-app by the client) - module* - "GameBootstrap" - function* - "Start" frame* (marked in-app by the client) module* "EnemySpawner+d__4" @@ -47,7 +42,7 @@ contributing variants: function* "ApplyDamage" system* - hash: "633f98691c6d46f1b91a753cfbb90cc0" + hash: "3280616726a0dc4b6230272e6ae3cafb" contributing component: exception hint: None root_component: @@ -56,16 +51,6 @@ contributing variants: type* "System.NullReferenceException" stacktrace* - frame* - module* - "GameBootstrap" - function* - "Start" - frame* - module* - "UnityEngine.MonoBehaviour" - function* - "StartCoroutine" frame* module* "UnityEngine.SetupCoroutine" diff --git a/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_android.pysnap b/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_android.pysnap index 6ea235828591..fbcfa6e8c1f5 100644 --- a/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_android.pysnap +++ b/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_android.pysnap @@ -5,7 +5,7 @@ hash_basis: stacktrace hashing_metadata: { "num_stacktraces": 1, "stacktrace_location": "exception", - "stacktrace_type": "system" + "stacktrace_type": "in_app" } --- metrics with tags: { @@ -16,13 +16,33 @@ metrics with tags: { "grouping.grouphashmetadata.event_hashing_metadata.stacktrace": { "chained_exception": "False", "stacktrace_location": "exception", - "stacktrace_type": "system" + "stacktrace_type": "in_app" } } --- contributing variants: + app* + hash: "f63a7669760e8a0c2dcecbc06dc16f93" + contributing component: exception + hint: None + root_component: + app* + exception* + type* + "EXC_BAD_ACCESS" + stacktrace* + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)) + filename* + "enemyspawner.cs" + function* + "EnemySpawner_Update" + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Packages/** +app)) + filename* + "combatsystem.cs" + function* + "CombatSystem_ApplyDamage" system* - hash: "04d641eb30b794030ed5b0d7d779eb05" + hash: "c6d72dd5829e54954efeebeb8410db6f" contributing component: exception hint: None root_component: @@ -70,9 +90,3 @@ contributing variants: "il2cppcodegen.cpp" function* "il2cpp_codegen_raise_null_reference_exception" - frame* - function* - "sentry__handle_signal" - frame* - function* - "sentry_android_capture_envelope" diff --git a/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_edge_cases.pysnap b/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_edge_cases.pysnap index f661ce28b08e..b462498ee51f 100644 --- a/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_edge_cases.pysnap +++ b/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_edge_cases.pysnap @@ -22,7 +22,7 @@ metrics with tags: { --- contributing variants: app* - hash: "539935023e2db3e104789c1c69ca2cf5" + hash: "7773ac6e847d4427f46d22c4ba6dcda3" contributing component: exception hint: None root_component: @@ -39,11 +39,18 @@ contributing variants: frame* (marked in-app by the client) function* "developer_own_libgame_binary_not_unity_gameactivity_glue" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)) + filename* + "enemyspawner.cs" function* - "legacy_ios_engine_binary_unity_6000_0_and_older" + "windows_il2cpp_project_source_with_backslash_paths" + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)) + filename* + "enemyspawner.cs" + function* + "linux_il2cpp_project_source" system* - hash: "7429f5a97df8b817f3b36cab1970f9ea" + hash: "d36fe8387b0516dbdd89bd3b551cb075" contributing component: exception hint: None root_component: @@ -83,6 +90,3 @@ contributing variants: frame* function* "legacy_ios_engine_binary_unity_6000_0_and_older" - frame* - function* - "windows_sentry_native_sdk" diff --git a/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_ios.pysnap b/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_ios.pysnap index ce9ec2a6c445..ae7f6c1b4875 100644 --- a/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_ios.pysnap +++ b/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_ios.pysnap @@ -22,7 +22,7 @@ metrics with tags: { --- contributing variants: app* - hash: "8760559d1e6a17097dca358c8389b245" + hash: "f63a7669760e8a0c2dcecbc06dc16f93" contributing component: exception hint: None root_component: @@ -31,55 +31,16 @@ contributing variants: type* "EXC_BAD_ACCESS" stacktrace* - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) - filename* - "main.mm" - function* - "main" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) - filename* - "main.mm" - function* - "-[UnityFramework runUIApplicationMainWithArgc:argv:]" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) - function* - "-[UnityAppController repaint]" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) - function* - "PlayerLoop" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) - function* - "ScriptingInvocation::Invoke" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) - filename* - "il2cppinvokertable.cpp" - function* - "RuntimeInvoker_TrueVoid_t22962CB4C05B1D89B55A6E1139F0E87A90987017" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)) filename* "enemyspawner.cs" function* "EnemySpawner_Update" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Packages/** +app)) filename* "combatsystem.cs" function* "CombatSystem_ApplyDamage" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) - filename* - "tmp_text.cs" - function* - "TMP_Text_SetText" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) - filename* - "animation.bindings.cs" - function* - "Animation_Play" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) - filename* - "il2cppcodegen.cpp" - function* - "il2cpp_codegen_raise_null_reference_exception" system* hash: "c5c6df56950274d88cb9f400ee61b8b0" contributing component: exception diff --git a/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_linux.pysnap b/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_linux.pysnap index 50fba82bc44d..b38a688052d9 100644 --- a/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_linux.pysnap +++ b/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_linux.pysnap @@ -5,7 +5,7 @@ hash_basis: stacktrace hashing_metadata: { "num_stacktraces": 1, "stacktrace_location": "exception", - "stacktrace_type": "system" + "stacktrace_type": "in_app" } --- metrics with tags: { @@ -16,13 +16,33 @@ metrics with tags: { "grouping.grouphashmetadata.event_hashing_metadata.stacktrace": { "chained_exception": "False", "stacktrace_location": "exception", - "stacktrace_type": "system" + "stacktrace_type": "in_app" } } --- contributing variants: + app* + hash: "f63a7669760e8a0c2dcecbc06dc16f93" + contributing component: exception + hint: None + root_component: + app* + exception* + type* + "EXC_BAD_ACCESS" + stacktrace* + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)) + filename* + "enemyspawner.cs" + function* + "EnemySpawner_Update" + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Packages/** +app)) + filename* + "combatsystem.cs" + function* + "CombatSystem_ApplyDamage" system* - hash: "cd7247c52d95df0f046b9e8d86ca231f" + hash: "aeca1dc80143ed497c670fd61b7d30a2" contributing component: exception hint: None root_component: @@ -73,6 +93,3 @@ contributing variants: "il2cppcodegen.cpp" function* "il2cpp_codegen_raise_null_reference_exception" - frame* - function* - "sentry__handle_signal" diff --git a/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_macos.pysnap b/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_macos.pysnap index 8861992f46ca..b38a688052d9 100644 --- a/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_macos.pysnap +++ b/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_macos.pysnap @@ -22,7 +22,7 @@ metrics with tags: { --- contributing variants: app* - hash: "cd7247c52d95df0f046b9e8d86ca231f" + hash: "f63a7669760e8a0c2dcecbc06dc16f93" contributing component: exception hint: None root_component: @@ -31,48 +31,65 @@ contributing variants: type* "EXC_BAD_ACCESS" stacktrace* - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)) + filename* + "enemyspawner.cs" + function* + "EnemySpawner_Update" + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Packages/** +app)) + filename* + "combatsystem.cs" + function* + "CombatSystem_ApplyDamage" + system* + hash: "aeca1dc80143ed497c670fd61b7d30a2" + contributing component: exception + hint: None + root_component: + system* + exception* + type* + "EXC_BAD_ACCESS" + stacktrace* + frame* function* "main" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame* function* "UnityMain" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame* function* "PlayerLoop" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame* function* "ScriptingInvocation::Invoke" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame* filename* "il2cppinvokertable.cpp" function* "RuntimeInvoker_TrueVoid_t22962CB4C05B1D89B55A6E1139F0E87A90987017" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame* filename* "enemyspawner.cs" function* "EnemySpawner_Update" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame* filename* "combatsystem.cs" function* "CombatSystem_ApplyDamage" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame* filename* "tmp_text.cs" function* "TMP_Text_SetText" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame* filename* "animation.bindings.cs" function* "Animation_Play" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame* filename* "il2cppcodegen.cpp" function* "il2cpp_codegen_raise_null_reference_exception" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) - function* - "sentry__handle_signal" diff --git a/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_windows.pysnap b/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_windows.pysnap index 2dc7646cdc68..b60736ffed7e 100644 --- a/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_windows.pysnap +++ b/tests/sentry/grouping/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp_windows.pysnap @@ -5,7 +5,7 @@ hash_basis: stacktrace hashing_metadata: { "num_stacktraces": 1, "stacktrace_location": "exception", - "stacktrace_type": "system" + "stacktrace_type": "in_app" } --- metrics with tags: { @@ -16,13 +16,33 @@ metrics with tags: { "grouping.grouphashmetadata.event_hashing_metadata.stacktrace": { "chained_exception": "False", "stacktrace_location": "exception", - "stacktrace_type": "system" + "stacktrace_type": "in_app" } } --- contributing variants: + app* + hash: "f63a7669760e8a0c2dcecbc06dc16f93" + contributing component: exception + hint: None + root_component: + app* + exception* + type* + "EXC_BAD_ACCESS" + stacktrace* + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)) + filename* + "enemyspawner.cs" + function* + "EnemySpawner_Update" + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Packages/** +app)) + filename* + "combatsystem.cs" + function* + "CombatSystem_ApplyDamage" system* - hash: "44001547ce86280f99f76128242968f2" + hash: "842ac5c5513e5f5fc7d3d906eb18a746" contributing component: exception hint: None root_component: @@ -70,6 +90,3 @@ contributing variants: "il2cppcodegen.cpp" function* "il2cpp_codegen_raise_null_reference_exception" - frame* - function* - "sentry_handle_exception" diff --git a/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_coroutine_dispatch.pysnap b/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_coroutine_dispatch.pysnap index fa6f1e244c05..f82b74e529ee 100644 --- a/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_coroutine_dispatch.pysnap +++ b/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_coroutine_dispatch.pysnap @@ -42,8 +42,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info "name": "stacktrace", "values": [ { - "contributes": true, - "hint": "marked in-app by the client", + "contributes": false, + "hint": "marked in-app by the client but ignored by built-in stacktrace rule (family:other package:UnityEngine.CoreModule* function:InvokeMoveNext v-group)", "id": "frame", "name": null, "values": [ @@ -220,7 +220,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, "contributes": true, "description": "exception stacktrace — in-app frames", - "hash": "31cfc54cd60b693b789568c5ec9278e2", + "hash": "04eb3e30c44355bca4f760682c7b6198", "hint": null, "key": "app_exception_stacktrace", "type": "component" @@ -263,8 +263,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info "name": "stacktrace", "values": [ { - "contributes": true, - "hint": null, + "contributes": false, + "hint": "ignored by built-in stacktrace rule (family:other package:UnityEngine.CoreModule* function:InvokeMoveNext v-group)", "id": "frame", "name": null, "values": [ @@ -298,8 +298,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": null, + "contributes": false, + "hint": "ignored by built-in stacktrace rule (family:other package:UnityEngine.CoreModule* function:InvokeMoveNext v-group)", "id": "frame", "name": null, "values": [ @@ -441,7 +441,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, "contributes": true, "description": "exception stacktrace — all frames", - "hash": "633f98691c6d46f1b91a753cfbb90cc0", + "hash": "3280616726a0dc4b6230272e6ae3cafb", "hint": null, "key": "system_exception_stacktrace", "type": "component" diff --git a/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_android.pysnap b/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_android.pysnap index 11a8abe8d3a2..fbbc9a335d05 100644 --- a/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_android.pysnap +++ b/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_android.pysnap @@ -6,14 +6,14 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info "variants": { "app_exception_stacktrace": { "component": { - "contributes": false, - "hint": "ignored because system exception takes precedence", + "contributes": true, + "hint": null, "id": "app", "name": "in-app", "values": [ { - "contributes": false, - "hint": "ignored because this variant does not have a contributing stacktrace, but the system variant does", + "contributes": true, + "hint": null, "id": "exception", "name": "exception", "values": [ @@ -27,8 +27,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": null, + "contributes": false, + "hint": "ignored because stacktrace takes precedence", "id": "value", "name": null, "values": [ @@ -36,8 +36,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": false, - "hint": "ignored because it contains no in-app frames", + "contributes": true, + "hint": null, "id": "stacktrace", "name": "stacktrace", "values": [ @@ -105,7 +105,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:framework -app)", "id": "frame", "name": null, "values": [ @@ -136,7 +136,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:framework -app)", "id": "frame", "name": null, "values": [ @@ -167,7 +167,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp -app)", "id": "frame", "name": null, "values": [ @@ -199,8 +199,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": false, - "hint": "non app frame", + "contributes": true, + "hint": "marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)", "id": "frame", "name": null, "values": [ @@ -232,8 +232,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": false, - "hint": "non app frame", + "contributes": true, + "hint": "marked in-app by built-in stacktrace rule (category:il2cpp path:**/Packages/** +app)", "id": "frame", "name": null, "values": [ @@ -266,7 +266,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp path:**/Library/PackageCache/** -app)", "id": "frame", "name": null, "values": [ @@ -299,7 +299,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp path:**/unity/Modules/** -app)", "id": "frame", "name": null, "values": [ @@ -332,7 +332,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp -app)", "id": "frame", "name": null, "values": [ @@ -365,7 +365,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:telemetry -app)", "id": "frame", "name": null, "values": [ @@ -396,7 +396,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:telemetry -app)", "id": "frame", "name": null, "values": [ @@ -431,10 +431,10 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info } ] }, - "contributes": false, + "contributes": true, "description": "exception stacktrace — in-app frames", - "hash": null, - "hint": "ignored because system exception takes precedence", + "hash": "f63a7669760e8a0c2dcecbc06dc16f93", + "hint": null, "key": "app_exception_stacktrace", "type": "component" }, @@ -798,8 +798,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": null, + "contributes": false, + "hint": "ignored by built-in stacktrace rule (category:telemetry -group)", "id": "frame", "name": null, "values": [ @@ -829,8 +829,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": null, + "contributes": false, + "hint": "ignored by built-in stacktrace rule (category:telemetry -group)", "id": "frame", "name": null, "values": [ @@ -867,7 +867,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, "contributes": true, "description": "exception stacktrace — all frames", - "hash": "04d641eb30b794030ed5b0d7d779eb05", + "hash": "c6d72dd5829e54954efeebeb8410db6f", "hint": null, "key": "system_exception_stacktrace", "type": "component" diff --git a/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_edge_cases.pysnap b/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_edge_cases.pysnap index eeeac8fa314f..6667ad17b5dd 100644 --- a/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_edge_cases.pysnap +++ b/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_edge_cases.pysnap @@ -139,8 +139,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": false, - "hint": "non app frame", + "contributes": true, + "hint": "marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)", "id": "frame", "name": null, "values": [ @@ -172,8 +172,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": false, - "hint": "non app frame", + "contributes": true, + "hint": "marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)", "id": "frame", "name": null, "values": [ @@ -206,7 +206,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp path:**/Library/PackageCache/** -app)", "id": "frame", "name": null, "values": [ @@ -238,8 +238,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:framework -app)", "id": "frame", "name": null, "values": [ @@ -270,7 +270,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:telemetry -app)", "id": "frame", "name": null, "values": [ @@ -307,7 +307,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, "contributes": true, "description": "exception stacktrace — in-app frames", - "hash": "539935023e2db3e104789c1c69ca2cf5", + "hash": "7773ac6e847d4427f46d22c4ba6dcda3", "hint": null, "key": "app_exception_stacktrace", "type": "component" @@ -577,8 +577,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": null, + "contributes": false, + "hint": "ignored by built-in stacktrace rule (category:telemetry -group)", "id": "frame", "name": null, "values": [ @@ -615,7 +615,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, "contributes": true, "description": "exception stacktrace — all frames", - "hash": "7429f5a97df8b817f3b36cab1970f9ea", + "hash": "d36fe8387b0516dbdd89bd3b551cb075", "hint": null, "key": "system_exception_stacktrace", "type": "component" diff --git a/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_ios.pysnap b/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_ios.pysnap index 6e36986d1f18..1182e1aaa2a7 100644 --- a/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_ios.pysnap +++ b/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_ios.pysnap @@ -73,8 +73,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (family:native function:main | [category:il2cpp] -app)", "id": "frame", "name": null, "values": [ @@ -106,8 +106,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp -app)", "id": "frame", "name": null, "values": [ @@ -170,8 +170,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp -app)", "id": "frame", "name": null, "values": [ @@ -201,8 +201,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:framework -app)", "id": "frame", "name": null, "values": [ @@ -232,8 +232,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:framework -app)", "id": "frame", "name": null, "values": [ @@ -263,8 +263,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp -app)", "id": "frame", "name": null, "values": [ @@ -297,7 +297,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)", + "hint": "marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)", "id": "frame", "name": null, "values": [ @@ -330,7 +330,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)", + "hint": "marked in-app by built-in stacktrace rule (category:il2cpp path:**/Packages/** +app)", "id": "frame", "name": null, "values": [ @@ -362,8 +362,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp path:**/Library/PackageCache/** -app)", "id": "frame", "name": null, "values": [ @@ -395,8 +395,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp path:**/unity/Modules/** -app)", "id": "frame", "name": null, "values": [ @@ -428,8 +428,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp -app)", "id": "frame", "name": null, "values": [ @@ -462,7 +462,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "marked out of app by built-in stacktrace rule (family:native function:?[[]Sentry* -app)", + "hint": "marked out of app by built-in stacktrace rule (category:telemetry -app)", "id": "frame", "name": null, "values": [ @@ -530,7 +530,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, "contributes": true, "description": "exception stacktrace — in-app frames", - "hash": "8760559d1e6a17097dca358c8389b245", + "hash": "f63a7669760e8a0c2dcecbc06dc16f93", "hint": null, "key": "app_exception_stacktrace", "type": "component" diff --git a/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_linux.pysnap b/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_linux.pysnap index e64f06bc987d..3d7ed868c380 100644 --- a/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_linux.pysnap +++ b/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_linux.pysnap @@ -6,14 +6,14 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info "variants": { "app_exception_stacktrace": { "component": { - "contributes": false, - "hint": "ignored because system exception takes precedence", + "contributes": true, + "hint": null, "id": "app", "name": "in-app", "values": [ { - "contributes": false, - "hint": "ignored because this variant does not have a contributing stacktrace, but the system variant does", + "contributes": true, + "hint": null, "id": "exception", "name": "exception", "values": [ @@ -27,8 +27,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": null, + "contributes": false, + "hint": "ignored because stacktrace takes precedence", "id": "value", "name": null, "values": [ @@ -36,14 +36,14 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": false, - "hint": "ignored because it contains no in-app frames", + "contributes": true, + "hint": null, "id": "stacktrace", "name": "stacktrace", "values": [ { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (family:native function:main | [package:**/UnityPlayer.*] -app)", "id": "frame", "name": null, "values": [ @@ -74,7 +74,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:framework -app)", "id": "frame", "name": null, "values": [ @@ -105,7 +105,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:framework -app)", "id": "frame", "name": null, "values": [ @@ -136,7 +136,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:framework -app)", "id": "frame", "name": null, "values": [ @@ -167,7 +167,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp -app)", "id": "frame", "name": null, "values": [ @@ -199,8 +199,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": false, - "hint": "non app frame", + "contributes": true, + "hint": "marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)", "id": "frame", "name": null, "values": [ @@ -232,8 +232,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": false, - "hint": "non app frame", + "contributes": true, + "hint": "marked in-app by built-in stacktrace rule (category:il2cpp path:**/Packages/** +app)", "id": "frame", "name": null, "values": [ @@ -266,7 +266,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp path:**/Library/PackageCache/** -app)", "id": "frame", "name": null, "values": [ @@ -299,7 +299,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp path:**/unity/Modules/** -app)", "id": "frame", "name": null, "values": [ @@ -332,7 +332,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp -app)", "id": "frame", "name": null, "values": [ @@ -365,7 +365,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:telemetry -app)", "id": "frame", "name": null, "values": [ @@ -400,10 +400,10 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info } ] }, - "contributes": false, + "contributes": true, "description": "exception stacktrace — in-app frames", - "hash": null, - "hint": "ignored because system exception takes precedence", + "hash": "f63a7669760e8a0c2dcecbc06dc16f93", + "hint": null, "key": "app_exception_stacktrace", "type": "component" }, @@ -767,8 +767,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": null, + "contributes": false, + "hint": "ignored by built-in stacktrace rule (category:telemetry -group)", "id": "frame", "name": null, "values": [ @@ -805,7 +805,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, "contributes": true, "description": "exception stacktrace — all frames", - "hash": "cd7247c52d95df0f046b9e8d86ca231f", + "hash": "aeca1dc80143ed497c670fd61b7d30a2", "hint": null, "key": "system_exception_stacktrace", "type": "component" diff --git a/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_macos.pysnap b/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_macos.pysnap index 3f35c617d08a..b1750d66e601 100644 --- a/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_macos.pysnap +++ b/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_macos.pysnap @@ -42,8 +42,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info "name": "stacktrace", "values": [ { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (family:native function:main | [package:**/UnityPlayer.*] -app)", "id": "frame", "name": null, "values": [ @@ -73,8 +73,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:framework -app)", "id": "frame", "name": null, "values": [ @@ -104,8 +104,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:framework -app)", "id": "frame", "name": null, "values": [ @@ -135,8 +135,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:framework -app)", "id": "frame", "name": null, "values": [ @@ -166,8 +166,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp -app)", "id": "frame", "name": null, "values": [ @@ -200,7 +200,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)", + "hint": "marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)", "id": "frame", "name": null, "values": [ @@ -233,7 +233,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)", + "hint": "marked in-app by built-in stacktrace rule (category:il2cpp path:**/Packages/** +app)", "id": "frame", "name": null, "values": [ @@ -265,8 +265,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp path:**/Library/PackageCache/** -app)", "id": "frame", "name": null, "values": [ @@ -298,8 +298,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp path:**/unity/Modules/** -app)", "id": "frame", "name": null, "values": [ @@ -331,8 +331,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp -app)", "id": "frame", "name": null, "values": [ @@ -364,8 +364,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": "marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)", + "contributes": false, + "hint": "marked out of app by built-in stacktrace rule (category:telemetry -app)", "id": "frame", "name": null, "values": [ @@ -396,7 +396,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "marked out of app by built-in stacktrace rule (family:native function:?[[]Sentry* -app)", + "hint": "marked out of app by built-in stacktrace rule (category:telemetry -app)", "id": "frame", "name": null, "values": [ @@ -433,21 +433,21 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, "contributes": true, "description": "exception stacktrace — in-app frames", - "hash": "cd7247c52d95df0f046b9e8d86ca231f", + "hash": "f63a7669760e8a0c2dcecbc06dc16f93", "hint": null, "key": "app_exception_stacktrace", "type": "component" }, "system_exception_stacktrace": { "component": { - "contributes": false, - "hint": "ignored because app exception takes precedence", + "contributes": true, + "hint": null, "id": "system", "name": null, "values": [ { - "contributes": false, - "hint": "ignored because hash matches app variant", + "contributes": true, + "hint": null, "id": "exception", "name": "exception", "values": [ @@ -798,8 +798,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": null, + "contributes": false, + "hint": "ignored by built-in stacktrace rule (category:telemetry -group)", "id": "frame", "name": null, "values": [ @@ -865,10 +865,10 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info } ] }, - "contributes": false, + "contributes": true, "description": "exception stacktrace — all frames", - "hash": null, - "hint": "ignored because app exception takes precedence", + "hash": "aeca1dc80143ed497c670fd61b7d30a2", + "hint": null, "key": "system_exception_stacktrace", "type": "component" } diff --git a/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_windows.pysnap b/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_windows.pysnap index bb16a6b92744..3f67df5c1d90 100644 --- a/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_windows.pysnap +++ b/tests/sentry/grouping/snapshots/grouping_info/test_grouping_info/newstyle@2026_01_20/unity_il2cpp_windows.pysnap @@ -6,14 +6,14 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info "variants": { "app_exception_stacktrace": { "component": { - "contributes": false, - "hint": "ignored because system exception takes precedence", + "contributes": true, + "hint": null, "id": "app", "name": "in-app", "values": [ { - "contributes": false, - "hint": "ignored because this variant does not have a contributing stacktrace, but the system variant does", + "contributes": true, + "hint": null, "id": "exception", "name": "exception", "values": [ @@ -27,8 +27,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": null, + "contributes": false, + "hint": "ignored because stacktrace takes precedence", "id": "value", "name": null, "values": [ @@ -36,8 +36,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": false, - "hint": "ignored because it contains no in-app frames", + "contributes": true, + "hint": null, "id": "stacktrace", "name": "stacktrace", "values": [ @@ -74,7 +74,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:framework -app)", "id": "frame", "name": null, "values": [ @@ -105,7 +105,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:framework -app)", "id": "frame", "name": null, "values": [ @@ -136,7 +136,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:framework -app)", "id": "frame", "name": null, "values": [ @@ -167,7 +167,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp -app)", "id": "frame", "name": null, "values": [ @@ -199,8 +199,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": false, - "hint": "non app frame", + "contributes": true, + "hint": "marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)", "id": "frame", "name": null, "values": [ @@ -232,8 +232,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": false, - "hint": "non app frame", + "contributes": true, + "hint": "marked in-app by built-in stacktrace rule (category:il2cpp path:**/Packages/** +app)", "id": "frame", "name": null, "values": [ @@ -266,7 +266,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp path:**/Library/PackageCache/** -app)", "id": "frame", "name": null, "values": [ @@ -299,7 +299,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp path:**/unity/Modules/** -app)", "id": "frame", "name": null, "values": [ @@ -332,7 +332,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:il2cpp -app)", "id": "frame", "name": null, "values": [ @@ -365,7 +365,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, { "contributes": false, - "hint": "non app frame", + "hint": "marked out of app by built-in stacktrace rule (category:telemetry -app)", "id": "frame", "name": null, "values": [ @@ -400,10 +400,10 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info } ] }, - "contributes": false, + "contributes": true, "description": "exception stacktrace — in-app frames", - "hash": null, - "hint": "ignored because system exception takes precedence", + "hash": "f63a7669760e8a0c2dcecbc06dc16f93", + "hint": null, "key": "app_exception_stacktrace", "type": "component" }, @@ -767,8 +767,8 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info ] }, { - "contributes": true, - "hint": null, + "contributes": false, + "hint": "ignored by built-in stacktrace rule (category:telemetry -group)", "id": "frame", "name": null, "values": [ @@ -805,7 +805,7 @@ source: tests/sentry/grouping/test_grouping_info.py::test_grouping_info }, "contributes": true, "description": "exception stacktrace — all frames", - "hash": "44001547ce86280f99f76128242968f2", + "hash": "842ac5c5513e5f5fc7d3d906eb18a746", "hint": null, "key": "system_exception_stacktrace", "type": "component" diff --git a/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_coroutine_dispatch.pysnap b/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_coroutine_dispatch.pysnap index cdcc8e099460..7f1ae3914cfa 100644 --- a/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_coroutine_dispatch.pysnap +++ b/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_coroutine_dispatch.pysnap @@ -2,7 +2,7 @@ source: tests/sentry/grouping/test_variants.py::test_variants --- app: - hash: "31cfc54cd60b693b789568c5ec9278e2" + hash: "04eb3e30c44355bca4f760682c7b6198" contributing component: exception hint: None root_component: @@ -13,7 +13,7 @@ app: value (ignored because stacktrace takes precedence) "Object reference not set to an instance of an object" stacktrace* - frame* (marked in-app by the client) + frame (marked in-app by the client but ignored by built-in stacktrace rule (family:other package:UnityEngine.CoreModule* function:InvokeMoveNext v-group)) module* "GameBootstrap" filename (ignored because module takes precedence) @@ -46,7 +46,7 @@ app: "ApplyDamage" -------------------------------------------------------------------------- system: - hash: "633f98691c6d46f1b91a753cfbb90cc0" + hash: "3280616726a0dc4b6230272e6ae3cafb" contributing component: exception hint: None root_component: @@ -57,14 +57,14 @@ system: value (ignored because stacktrace takes precedence) "Object reference not set to an instance of an object" stacktrace* - frame* + frame (ignored by built-in stacktrace rule (family:other package:UnityEngine.CoreModule* function:InvokeMoveNext v-group)) module* "GameBootstrap" filename (ignored because module takes precedence) "gamebootstrap.cs" function* "Start" - frame* + frame (ignored by built-in stacktrace rule (family:other package:UnityEngine.CoreModule* function:InvokeMoveNext v-group)) module* "UnityEngine.MonoBehaviour" function* diff --git a/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_android.pysnap b/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_android.pysnap index 2ca68e3d706d..0d0b1cf3ad7e 100644 --- a/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_android.pysnap +++ b/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_android.pysnap @@ -2,68 +2,68 @@ source: tests/sentry/grouping/test_variants.py::test_variants --- app: - hash: null - contributing component: null - hint: ignored because system exception takes precedence + hash: "f63a7669760e8a0c2dcecbc06dc16f93" + contributing component: exception + hint: None root_component: - app (ignored because system exception takes precedence) - exception (ignored because this variant does not have a contributing stacktrace, but the system variant does) + app* + exception* type* "EXC_BAD_ACCESS" - value* + value (ignored because stacktrace takes precedence) "Attempted to dereference null pointer." - stacktrace (ignored because it contains no in-app frames) + stacktrace* frame (marked out of app by built-in stacktrace rule (category:internals -app)) function* "__libc_init" frame (non app frame) function* "android_main" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:framework -app)) function* "UnityPlayerLoop" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:framework -app)) function* "ScriptingInvocation::Invoke" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:il2cpp -app)) filename* "il2cppinvokertable.cpp" function* "RuntimeInvoker_TrueVoid_t22962CB4C05B1D89B55A6E1139F0E87A90987017" - frame (non app frame) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)) filename* "enemyspawner.cs" function* "EnemySpawner_Update" - frame (non app frame) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Packages/** +app)) filename* "combatsystem.cs" function* "CombatSystem_ApplyDamage" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:il2cpp path:**/Library/PackageCache/** -app)) filename* "tmp_text.cs" function* "TMP_Text_SetText" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:il2cpp path:**/unity/Modules/** -app)) filename* "animation.bindings.cs" function* "Animation_Play" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:il2cpp -app)) filename* "il2cppcodegen.cpp" function* "il2cpp_codegen_raise_null_reference_exception" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:telemetry -app)) function* "sentry__handle_signal" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:telemetry -app)) function* "sentry_android_capture_envelope" -------------------------------------------------------------------------- system: - hash: "04d641eb30b794030ed5b0d7d779eb05" + hash: "c6d72dd5829e54954efeebeb8410db6f" contributing component: exception hint: None root_component: @@ -116,9 +116,9 @@ system: "il2cppcodegen.cpp" function* "il2cpp_codegen_raise_null_reference_exception" - frame* + frame (ignored by built-in stacktrace rule (category:telemetry -group)) function* "sentry__handle_signal" - frame* + frame (ignored by built-in stacktrace rule (category:telemetry -group)) function* "sentry_android_capture_envelope" diff --git a/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_edge_cases.pysnap b/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_edge_cases.pysnap index 7398f131c4bd..f6cff8cb96e7 100644 --- a/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_edge_cases.pysnap +++ b/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_edge_cases.pysnap @@ -2,7 +2,7 @@ source: tests/sentry/grouping/test_variants.py::test_variants --- app: - hash: "539935023e2db3e104789c1c69ca2cf5" + hash: "7773ac6e847d4427f46d22c4ba6dcda3" contributing component: exception hint: None root_component: @@ -26,30 +26,30 @@ app: frame* (marked in-app by the client) function* "developer_own_libgame_binary_not_unity_gameactivity_glue" - frame (non app frame) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)) filename* "enemyspawner.cs" function* "windows_il2cpp_project_source_with_backslash_paths" - frame (non app frame) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)) filename* "enemyspawner.cs" function* "linux_il2cpp_project_source" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:il2cpp path:**/Library/PackageCache/** -app)) filename* "inputaction.cs" function* "registry_package_source_under_runtime_dir_never_restored" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) + frame (marked out of app by built-in stacktrace rule (category:framework -app)) function* "legacy_ios_engine_binary_unity_6000_0_and_older" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:telemetry -app)) function* "windows_sentry_native_sdk" -------------------------------------------------------------------------- system: - hash: "7429f5a97df8b817f3b36cab1970f9ea" + hash: "d36fe8387b0516dbdd89bd3b551cb075" contributing component: exception hint: None root_component: @@ -91,6 +91,6 @@ system: frame* function* "legacy_ios_engine_binary_unity_6000_0_and_older" - frame* + frame (ignored by built-in stacktrace rule (category:telemetry -group)) function* "windows_sentry_native_sdk" diff --git a/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_ios.pysnap b/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_ios.pysnap index 27f4dbd37dc2..bd9b673f5713 100644 --- a/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_ios.pysnap +++ b/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_ios.pysnap @@ -2,7 +2,7 @@ source: tests/sentry/grouping/test_variants.py::test_variants --- app: - hash: "8760559d1e6a17097dca358c8389b245" + hash: "f63a7669760e8a0c2dcecbc06dc16f93" contributing component: exception hint: None root_component: @@ -16,12 +16,12 @@ app: frame (marked out of app by built-in stacktrace rule (category:system -app)) function* "start" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) + frame (marked out of app by built-in stacktrace rule (family:native function:main | [category:il2cpp] -app)) filename* "main.mm" function* "main" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) + frame (marked out of app by built-in stacktrace rule (category:il2cpp -app)) filename* "main.mm" function* @@ -29,46 +29,46 @@ app: frame (non app frame) function* "UIApplicationMain" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) + frame (marked out of app by built-in stacktrace rule (category:il2cpp -app)) function* "-[UnityAppController repaint]" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) + frame (marked out of app by built-in stacktrace rule (category:framework -app)) function* "PlayerLoop" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) + frame (marked out of app by built-in stacktrace rule (category:framework -app)) function* "ScriptingInvocation::Invoke" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) + frame (marked out of app by built-in stacktrace rule (category:il2cpp -app)) filename* "il2cppinvokertable.cpp" function* "RuntimeInvoker_TrueVoid_t22962CB4C05B1D89B55A6E1139F0E87A90987017" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)) filename* "enemyspawner.cs" function* "EnemySpawner_Update" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Packages/** +app)) filename* "combatsystem.cs" function* "CombatSystem_ApplyDamage" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) + frame (marked out of app by built-in stacktrace rule (category:il2cpp path:**/Library/PackageCache/** -app)) filename* "tmp_text.cs" function* "TMP_Text_SetText" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) + frame (marked out of app by built-in stacktrace rule (category:il2cpp path:**/unity/Modules/** -app)) filename* "animation.bindings.cs" function* "Animation_Play" - frame* (marked in-app by built-in stacktrace rule (family:native package:**/Containers/Bundle/Application/** +app)) + frame (marked out of app by built-in stacktrace rule (category:il2cpp -app)) filename* "il2cppcodegen.cpp" function* "il2cpp_codegen_raise_null_reference_exception" - frame (marked out of app by built-in stacktrace rule (family:native function:?[[]Sentry* -app)) + frame (marked out of app by built-in stacktrace rule (category:telemetry -app)) function* "-[SentryCrashInstallationReporter reportCrash]" frame (marked out of app by built-in stacktrace rule (category:internals -app)) diff --git a/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_linux.pysnap b/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_linux.pysnap index 9c6640d770b1..bdf784ba7448 100644 --- a/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_linux.pysnap +++ b/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_linux.pysnap @@ -2,65 +2,65 @@ source: tests/sentry/grouping/test_variants.py::test_variants --- app: - hash: null - contributing component: null - hint: ignored because system exception takes precedence + hash: "f63a7669760e8a0c2dcecbc06dc16f93" + contributing component: exception + hint: None root_component: - app (ignored because system exception takes precedence) - exception (ignored because this variant does not have a contributing stacktrace, but the system variant does) + app* + exception* type* "EXC_BAD_ACCESS" - value* + value (ignored because stacktrace takes precedence) "Attempted to dereference null pointer." - stacktrace (ignored because it contains no in-app frames) - frame (non app frame) + stacktrace* + frame (marked out of app by built-in stacktrace rule (family:native function:main | [package:**/UnityPlayer.*] -app)) function* "main" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:framework -app)) function* "UnityMain" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:framework -app)) function* "PlayerLoop" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:framework -app)) function* "ScriptingInvocation::Invoke" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:il2cpp -app)) filename* "il2cppinvokertable.cpp" function* "RuntimeInvoker_TrueVoid_t22962CB4C05B1D89B55A6E1139F0E87A90987017" - frame (non app frame) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)) filename* "enemyspawner.cs" function* "EnemySpawner_Update" - frame (non app frame) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Packages/** +app)) filename* "combatsystem.cs" function* "CombatSystem_ApplyDamage" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:il2cpp path:**/Library/PackageCache/** -app)) filename* "tmp_text.cs" function* "TMP_Text_SetText" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:il2cpp path:**/unity/Modules/** -app)) filename* "animation.bindings.cs" function* "Animation_Play" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:il2cpp -app)) filename* "il2cppcodegen.cpp" function* "il2cpp_codegen_raise_null_reference_exception" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:telemetry -app)) function* "sentry__handle_signal" -------------------------------------------------------------------------- system: - hash: "cd7247c52d95df0f046b9e8d86ca231f" + hash: "aeca1dc80143ed497c670fd61b7d30a2" contributing component: exception hint: None root_component: @@ -113,6 +113,6 @@ system: "il2cppcodegen.cpp" function* "il2cpp_codegen_raise_null_reference_exception" - frame* + frame (ignored by built-in stacktrace rule (category:telemetry -group)) function* "sentry__handle_signal" diff --git a/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_macos.pysnap b/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_macos.pysnap index 9770a121bec5..9a7529d99282 100644 --- a/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_macos.pysnap +++ b/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_macos.pysnap @@ -2,7 +2,7 @@ source: tests/sentry/grouping/test_variants.py::test_variants --- app: - hash: "cd7247c52d95df0f046b9e8d86ca231f" + hash: "f63a7669760e8a0c2dcecbc06dc16f93" contributing component: exception hint: None root_component: @@ -13,62 +13,62 @@ app: value (ignored because stacktrace takes precedence) "Attempted to dereference null pointer." stacktrace* - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame (marked out of app by built-in stacktrace rule (family:native function:main | [package:**/UnityPlayer.*] -app)) function* "main" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame (marked out of app by built-in stacktrace rule (category:framework -app)) function* "UnityMain" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame (marked out of app by built-in stacktrace rule (category:framework -app)) function* "PlayerLoop" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame (marked out of app by built-in stacktrace rule (category:framework -app)) function* "ScriptingInvocation::Invoke" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame (marked out of app by built-in stacktrace rule (category:il2cpp -app)) filename* "il2cppinvokertable.cpp" function* "RuntimeInvoker_TrueVoid_t22962CB4C05B1D89B55A6E1139F0E87A90987017" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)) filename* "enemyspawner.cs" function* "EnemySpawner_Update" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Packages/** +app)) filename* "combatsystem.cs" function* "CombatSystem_ApplyDamage" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame (marked out of app by built-in stacktrace rule (category:il2cpp path:**/Library/PackageCache/** -app)) filename* "tmp_text.cs" function* "TMP_Text_SetText" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame (marked out of app by built-in stacktrace rule (category:il2cpp path:**/unity/Modules/** -app)) filename* "animation.bindings.cs" function* "Animation_Play" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame (marked out of app by built-in stacktrace rule (category:il2cpp -app)) filename* "il2cppcodegen.cpp" function* "il2cpp_codegen_raise_null_reference_exception" - frame* (marked in-app by built-in stacktrace rule (family:native package:/Users/** +app)) + frame (marked out of app by built-in stacktrace rule (category:telemetry -app)) function* "sentry__handle_signal" - frame (marked out of app by built-in stacktrace rule (family:native function:?[[]Sentry* -app)) + frame (marked out of app by built-in stacktrace rule (category:telemetry -app)) function* "+[SentrySDK captureCrashEvent:]" -------------------------------------------------------------------------- system: - hash: null - contributing component: null - hint: ignored because app exception takes precedence + hash: "aeca1dc80143ed497c670fd61b7d30a2" + contributing component: exception + hint: None root_component: - system (ignored because app exception takes precedence) - exception (ignored because hash matches app variant) + system* + exception* type* "EXC_BAD_ACCESS" value (ignored because stacktrace takes precedence) @@ -116,7 +116,7 @@ system: "il2cppcodegen.cpp" function* "il2cpp_codegen_raise_null_reference_exception" - frame* + frame (ignored by built-in stacktrace rule (category:telemetry -group)) function* "sentry__handle_signal" frame (ignored by built-in stacktrace rule (family:native function:?[[]Sentry* -group)) diff --git a/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_windows.pysnap b/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_windows.pysnap index 48bc20d802a6..5c5c13bbb2e9 100644 --- a/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_windows.pysnap +++ b/tests/sentry/grouping/snapshots/variants/test_variants/newstyle@2026_01_20/unity_il2cpp_windows.pysnap @@ -2,65 +2,65 @@ source: tests/sentry/grouping/test_variants.py::test_variants --- app: - hash: null - contributing component: null - hint: ignored because system exception takes precedence + hash: "f63a7669760e8a0c2dcecbc06dc16f93" + contributing component: exception + hint: None root_component: - app (ignored because system exception takes precedence) - exception (ignored because this variant does not have a contributing stacktrace, but the system variant does) + app* + exception* type* "EXC_BAD_ACCESS" - value* + value (ignored because stacktrace takes precedence) "Attempted to dereference null pointer." - stacktrace (ignored because it contains no in-app frames) + stacktrace* frame (non app frame) function* "wWinMain" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:framework -app)) function* "UnityMain" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:framework -app)) function* "PlayerLoop" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:framework -app)) function* "ScriptingInvocation::Invoke" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:il2cpp -app)) filename* "il2cppinvokertable.cpp" function* "RuntimeInvoker_TrueVoid_t22962CB4C05B1D89B55A6E1139F0E87A90987017" - frame (non app frame) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Assets/** +app)) filename* "enemyspawner.cs" function* "EnemySpawner_Update" - frame (non app frame) + frame* (marked in-app by built-in stacktrace rule (category:il2cpp path:**/Packages/** +app)) filename* "combatsystem.cs" function* "CombatSystem_ApplyDamage" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:il2cpp path:**/Library/PackageCache/** -app)) filename* "tmp_text.cs" function* "TMP_Text_SetText" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:il2cpp path:**/unity/Modules/** -app)) filename* "animation.bindings.cs" function* "Animation_Play" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:il2cpp -app)) filename* "il2cppcodegen.cpp" function* "il2cpp_codegen_raise_null_reference_exception" - frame (non app frame) + frame (marked out of app by built-in stacktrace rule (category:telemetry -app)) function* "sentry_handle_exception" -------------------------------------------------------------------------- system: - hash: "44001547ce86280f99f76128242968f2" + hash: "842ac5c5513e5f5fc7d3d906eb18a746" contributing component: exception hint: None root_component: @@ -113,6 +113,6 @@ system: "il2cppcodegen.cpp" function* "il2cpp_codegen_raise_null_reference_exception" - frame* + frame (ignored by built-in stacktrace rule (category:telemetry -group)) function* "sentry_handle_exception" From 1ddc36a52af82bd043a3575c3b925d3edcf60323 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 29 Oct 2026 10:38:49 +0100 Subject: [PATCH 2/2] fix(grouping): Keep the checkout path intact in grouping snapshot paths The snapshot helper swaps `-` for `_` to turn input file names and config ids into snapshot names, but it did so on the absolute path, so a checkout whose directory name contains `-` read and wrote snapshots under a directory that doesn't exist. A writeback there leaves a stray copy that later runs compare against, so tests pass on stale snapshots. Apply the swap only below the snapshots directory. Co-Authored-By: Claude Opus 5.5 --- tests/sentry/grouping/__init__.py | 5 ++--- .../grouping/test_grouphash_metadata.py | 21 ++++++++++++++++++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/tests/sentry/grouping/__init__.py b/tests/sentry/grouping/__init__.py index d793cb4d2aa1..6e66e1b5055f 100644 --- a/tests/sentry/grouping/__init__.py +++ b/tests/sentry/grouping/__init__.py @@ -196,15 +196,14 @@ def get_grouping_input_snapshotter( ) -> InstaSnapshotter: """Create a snapshot function with the output path baked in.""" snapshot_path = path.join( - SNAPSHOTS_DIR, folder_name, test_name, # Windows paths contain colons, so we have to swap out the colons in our config names config_name.replace(":", "@"), grouping_input_file.replace(".json", ".pysnap"), ) - # Convert from JSON to Python file formatting - snapshot_path = snapshot_path.replace("-", "_") + # Convert from JSON to Python file formatting, leaving the checkout's own path alone + snapshot_path = path.join(SNAPSHOTS_DIR, snapshot_path.replace("-", "_")) snapshot_function = functools.partial(insta_snapshot, reference_file=snapshot_path) diff --git a/tests/sentry/grouping/test_grouphash_metadata.py b/tests/sentry/grouping/test_grouphash_metadata.py index bce54adf4030..0798e2d46818 100644 --- a/tests/sentry/grouping/test_grouphash_metadata.py +++ b/tests/sentry/grouping/test_grouphash_metadata.py @@ -1,7 +1,7 @@ from __future__ import annotations from typing import Any -from unittest.mock import patch +from unittest.mock import Mock, patch from sentry.grouping.component import MessageGroupingComponent, RootGroupingComponent from sentry.grouping.ingest.grouphash_metadata import ( @@ -83,6 +83,25 @@ def test_unknown_hash_basis( _assert_and_snapshot_results(event, variants, config_name, create_snapshot) +def test_snapshot_path_keeps_checkout_path() -> None: + insta_snapshot = Mock() + + with patch("tests.sentry.grouping.SNAPSHOTS_DIR", "/src/my-checkout/snapshots"): + create_snapshot = get_grouping_input_snapshotter( + insta_snapshot, + folder_name="grouphash_metadata", + test_name="test_metadata_from_variants", + config_name="newstyle:2026-01-20", + grouping_input_file="unity-il2cpp.json", + ) + create_snapshot("dogs are great") + + insta_snapshot.assert_called_once_with( + "dogs are great", + reference_file="/src/my-checkout/snapshots/grouphash_metadata/test_metadata_from_variants/newstyle@2026_01_20/unity_il2cpp.pysnap", + ) + + def _assert_and_snapshot_results( event: Event, variants: dict[str, BaseVariant],