Skip to content

Commit 8a3a3b7

Browse files
philipphofmannc298lee
authored andcommitted
feat(sdk-crash): Keep sdk frame path for native (#68685)
Keep the SDK frame path for native without keeping application-related path information.
1 parent 3273a24 commit 8a3a3b7

File tree

3 files changed

+68
-7
lines changed

3 files changed

+68
-7
lines changed

fixtures/sdk_crash_detection/crash_event_native.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44

55
def get_frames(
6-
sdk_frame_function: str, system_frame_package: str
6+
sdk_frame_function: str,
7+
sdk_frame_package: str,
8+
system_frame_package: str,
79
) -> Sequence[MutableMapping[str, str]]:
810
frames = [
911
{
@@ -24,7 +26,7 @@ def get_frames(
2426
{
2527
"function": sdk_frame_function,
2628
"symbol": sdk_frame_function,
27-
"package": "E:\\Sentry\\Sentaurs\\Game\\Sentaurs.exe",
29+
"package": sdk_frame_package,
2830
},
2931
{
3032
"function": "boost::serialization::singleton<T>::singleton<T>",
@@ -37,11 +39,12 @@ def get_frames(
3739

3840
def get_crash_event(
3941
sdk_frame_function="sentry_value_to_msgpack",
42+
sdk_frame_package="E:\\Sentry\\Sentaurs\\Game\\Sentaurs.exe",
4043
system_frame_package="C:\\Windows\\System32\\DriverStore\\FileRepository\\u0398226.inf_amd64_c5d9587384e4b5ff\\B398182\\amdxx64.dll",
4144
**kwargs,
4245
) -> dict[str, object]:
4346
return get_crash_event_with_frames(
44-
get_frames(sdk_frame_function, system_frame_package),
47+
get_frames(sdk_frame_function, sdk_frame_package, system_frame_package),
4548
**kwargs,
4649
)
4750

src/sentry/utils/sdk_crashes/sdk_crash_detection_config.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -244,11 +244,13 @@ def build_sdk_crash_detection_configs() -> Sequence[SDKCrashDetectionConfig]:
244244
r"sentry__*", # module level interface
245245
r"Java_io_sentry_android_ndk_*", # JNI interface
246246
},
247-
# The native SDK usually has the same path as the application binary.
248-
# Therefore, we can't rely on it. We set a fixed path of Sentry for
249-
# the SDK frames are so it's not empty.
250247
path_patterns=set(),
251-
path_replacer=FixedPathReplacer(path="sentry"),
248+
path_replacer=KeepAfterPatternMatchPathReplacer(
249+
patterns={
250+
r"sentry_.*",
251+
},
252+
fallback_path="sentry",
253+
),
252254
),
253255
sdk_crash_ignore_functions_matchers=set(),
254256
)

tests/sentry/utils/sdk_crashes/test_sdk_crash_detection_native.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,62 @@ def test_sdk_crash_is_reported_with_native_paths(
174174
assert mock_sdk_crash_reporter.report.call_count == 0
175175

176176

177+
@pytest.mark.parametrize(
178+
["sdk_frame_function", "sdk_frame_package", "expected_sdk_frame_package"],
179+
[
180+
(
181+
"sentry_sync",
182+
"C:\\GitLab-Runner\\builds\\WEFASW\\0\\3rdParty\\Sentry\\upstream\\src\\sentry_sync.h",
183+
"sentry_sync.h",
184+
),
185+
(
186+
"sentry_value_to_msgpack",
187+
"sentry._sentry.h",
188+
"sentry",
189+
),
190+
(
191+
"sentry_value_to_msgpack",
192+
"some_weird_path/sentry__.h",
193+
"sentry__.h",
194+
),
195+
],
196+
)
197+
@decorators
198+
def test_sdk_crash_sentry_native_keeps_sentry_package_paths(
199+
mock_sdk_crash_reporter,
200+
mock_random,
201+
store_event,
202+
configs,
203+
sdk_frame_function,
204+
sdk_frame_package,
205+
expected_sdk_frame_package,
206+
):
207+
event = store_event(
208+
data=get_crash_event(
209+
sdk_frame_function=sdk_frame_function, sdk_frame_package=sdk_frame_package
210+
)
211+
)
212+
213+
configs[1].organization_allowlist = [event.project.organization_id]
214+
215+
sdk_crash_detection.detect_sdk_crash(event=event, configs=configs)
216+
217+
assert mock_sdk_crash_reporter.report.call_count == 1
218+
reported_event_data = mock_sdk_crash_reporter.report.call_args.args[0]
219+
220+
stripped_frames = get_path(
221+
reported_event_data, "exception", "values", -1, "stacktrace", "frames"
222+
)
223+
224+
assert len(stripped_frames) == 4
225+
226+
sdk_frame = stripped_frames[2]
227+
assert sdk_frame["function"] == sdk_frame_function
228+
assert sdk_frame["symbol"] == sdk_frame_function
229+
assert sdk_frame["package"] == expected_sdk_frame_package
230+
assert sdk_frame["in_app"] is True
231+
232+
177233
@decorators
178234
def test_beta_sdk_version_detected(mock_sdk_crash_reporter, mock_random, store_event, configs):
179235
event_data = get_crash_event()

0 commit comments

Comments
 (0)