Skip to content

Commit 313b1d9

Browse files
fix: Crash when initializing SentryHub manually (#3374)
Fix a crash when serializing the trace context after initializing the SentryHub manually. Co-authored-by: Andrew McKnight <[email protected]>
1 parent c471221 commit 313b1d9

File tree

12 files changed

+95
-26
lines changed

12 files changed

+95
-26
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
### Fixes
6+
7+
- Crash when initializing SentryHub manually (#3374)
8+
39
## 8.15.0
410

511
### Features

Sources/Sentry/SentryClient.m

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,9 @@ - (nullable SentryTraceContext *)getTraceStateWithEvent:(SentryEvent *)event
371371
}
372372

373373
if (event.error || event.exceptions.count > 0) {
374-
return scope.propagationContext.traceContext;
374+
return [[SentryTraceContext alloc] initWithTraceId:scope.propagationContext.traceId
375+
options:self.options
376+
userSegment:scope.userObject.segment];
375377
}
376378

377379
return nil;

Sources/Sentry/SentryNetworkTracker.m

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#import "SentryTraceHeader.h"
2424
#import "SentryTraceOrigins.h"
2525
#import "SentryTracer.h"
26+
#import "SentryUser.h"
2627
#import <objc/runtime.h>
2728
@import SentryPrivate;
2829

@@ -216,7 +217,12 @@ - (void)urlSessionTaskResume:(NSURLSessionTask *)sessionTask
216217
- (void)addTraceWithoutTransactionToTask:(NSURLSessionTask *)sessionTask
217218
{
218219
SentryPropagationContext *propagationContext = SentrySDK.currentHub.scope.propagationContext;
219-
[self addBaggageHeader:[[propagationContext traceContext] toBaggage]
220+
SentryTraceContext *traceContext =
221+
[[SentryTraceContext alloc] initWithTraceId:propagationContext.traceId
222+
options:SentrySDK.currentHub.client.options
223+
userSegment:SentrySDK.currentHub.scope.userObject.segment];
224+
225+
[self addBaggageHeader:[traceContext toBaggage]
220226
traceHeader:[propagationContext traceHeader]
221227
toRequest:sessionTask];
222228
}

Sources/Sentry/SentryPropagationContext.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ NS_ASSUME_NONNULL_BEGIN
88

99
@property (nonatomic, strong) SentryId *traceId;
1010
@property (nonatomic, strong) SentrySpanId *spanId;
11-
@property (nonatomic, readonly, nullable) SentryTraceContext *traceContext;
12-
1311
@property (nonatomic, readonly) SentryTraceHeader *traceHeader;
1412

1513
- (NSDictionary<NSString *, NSString *> *)traceContextForEvent;

Sources/Sentry/SentryPropagationContext.m

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,6 @@ - (SentryTraceHeader *)traceHeader
2828
sampled:kSentrySampleDecisionNo];
2929
}
3030

31-
- (SentryTraceContext *)traceContext
32-
{
33-
SentryOptions *options = SentrySDK.options;
34-
SentryScope *scope = SentrySDK.currentHub.scope;
35-
return [[SentryTraceContext alloc] initWithTraceId:self.traceId
36-
publicKey:options.parsedDsn.url.user
37-
releaseName:options.releaseName
38-
environment:options.environment
39-
transaction:nil
40-
userSegment:scope.userObject.segment
41-
sampleRate:nil
42-
sampled:nil];
43-
}
44-
4531
- (NSDictionary<NSString *, NSString *> *)traceContextForEvent
4632
{
4733
return

Sources/Sentry/SentryTraceContext.m

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,20 @@ - (nullable instancetype)initWithTracer:(SentryTracer *)tracer
8383
sampled:sampled];
8484
}
8585

86+
- (instancetype)initWithTraceId:(SentryId *)traceId
87+
options:(SentryOptions *)options
88+
userSegment:(nullable NSString *)userSegment
89+
{
90+
return [[SentryTraceContext alloc] initWithTraceId:traceId
91+
publicKey:options.parsedDsn.url.user
92+
releaseName:options.releaseName
93+
environment:options.environment
94+
transaction:nil
95+
userSegment:userSegment
96+
sampleRate:nil
97+
sampled:nil];
98+
}
99+
86100
- (nullable instancetype)initWithDict:(NSDictionary<NSString *, id> *)dictionary
87101
{
88102
SentryId *traceId = [[SentryId alloc] initWithUUIDString:dictionary[@"trace_id"]];

Sources/Sentry/include/SentryTraceContext.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,17 @@ NS_ASSUME_NONNULL_BEGIN
8686
scope:(nullable SentryScope *)scope
8787
options:(SentryOptions *)options;
8888

89+
/**
90+
* Initializes a SentryTraceContext with data from a traceID, options and userSegment.
91+
*
92+
* @param traceId The current tracer.
93+
* @param options The current active options.
94+
* @param userSegment You can retrieve this usually from the `scope.userObject.segment`.
95+
*/
96+
- (instancetype)initWithTraceId:(SentryId *)traceId
97+
options:(SentryOptions *)options
98+
userSegment:(nullable NSString *)userSegment;
99+
89100
/**
90101
* Create a SentryBaggage with the information of this SentryTraceContext.
91102
*/

Tests/SentryTests/Integrations/Performance/Network/SentryNetworkTrackerTests.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,8 @@ class SentryNetworkTrackerTests: XCTestCase {
590590
sut.urlSessionTaskResume(task)
591591

592592
let expectedTraceHeader = SentrySDK.currentHub().scope.propagationContext.traceHeader.value()
593-
let expectedBaggageHeader = SentrySDK.currentHub().scope.propagationContext.traceContext?.toBaggage().toHTTPHeader()
593+
let traceContext = SentryTraceContext(trace: SentrySDK.currentHub().scope.propagationContext.traceId, options: self.fixture.options, userSegment: self.fixture.scope.userObject?.segment)
594+
let expectedBaggageHeader = traceContext.toBaggage().toHTTPHeader()
594595
XCTAssertEqual(task.currentRequest?.allHTTPHeaderFields?["baggage"] ?? "", expectedBaggageHeader)
595596
XCTAssertEqual(task.currentRequest?.allHTTPHeaderFields?["sentry-trace"] ?? "", expectedTraceHeader)
596597
}
@@ -601,7 +602,8 @@ class SentryNetworkTrackerTests: XCTestCase {
601602
sut.urlSessionTaskResume(task)
602603

603604
let expectedTraceHeader = SentrySDK.currentHub().scope.propagationContext.traceHeader.value()
604-
let expectedBaggageHeader = SentrySDK.currentHub().scope.propagationContext.traceContext?.toBaggage().toHTTPHeader()
605+
let traceContext = SentryTraceContext(trace: SentrySDK.currentHub().scope.propagationContext.traceId, options: self.fixture.options, userSegment: self.fixture.scope.userObject?.segment)
606+
let expectedBaggageHeader = traceContext.toBaggage().toHTTPHeader()
605607
XCTAssertEqual(task.currentRequest?.allHTTPHeaderFields?["baggage"] ?? "", expectedBaggageHeader)
606608
XCTAssertEqual(task.currentRequest?.allHTTPHeaderFields?["sentry-trace"] ?? "", expectedTraceHeader)
607609
}

Tests/SentryTests/SentryClientTests.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -555,8 +555,9 @@ class SentryClientTest: XCTestCase {
555555
try assertValidErrorEvent(eventWithSessionArguments.event, error)
556556
XCTAssertEqual(fixture.session, eventWithSessionArguments.session)
557557

558-
XCTAssertEqual(eventWithSessionArguments.traceContext?.traceId,
559-
scope.propagationContext.traceContext?.traceId)
558+
let expectedTraceContext = SentryTraceContext(trace: scope.propagationContext.traceId, options: Options(), userSegment: "segment")
559+
XCTAssertEqual(eventWithSessionArguments.traceContext?.traceId,
560+
expectedTraceContext.traceId)
560561
}
561562
}
562563

Tests/SentryTests/SentryHubTests.swift

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class SentryHubTests: XCTestCase {
5757
}
5858

5959
private var fixture: Fixture!
60-
private var sut: SentryHub!
60+
private lazy var sut = fixture.getSut()
6161

6262
override func setUp() {
6363
super.setUp()
@@ -67,8 +67,6 @@ class SentryHubTests: XCTestCase {
6767
fixture.fileManager.deleteAppState()
6868
fixture.fileManager.deleteTimestampLastInForeground()
6969
fixture.fileManager.deleteAllEnvelopes()
70-
71-
sut = fixture.getSut()
7270
}
7371

7472
override func tearDown() {
@@ -81,6 +79,17 @@ class SentryHubTests: XCTestCase {
8179
clearTestState()
8280
}
8381

82+
func testCaptureErrorWithRealDSN() {
83+
let sentryOption = Options()
84+
sentryOption.dsn = "https://[email protected]/5428557"
85+
86+
let scope = Scope()
87+
let sentryHub = SentryHub(client: SentryClient(options: sentryOption), andScope: scope)
88+
89+
let error = NSError(domain: "Test.CaptureErrorWithRealDSN", code: 12)
90+
sentryHub.capture(error: error)
91+
}
92+
8493
func testBeforeBreadcrumbWithoutCallbackStoresBreadcrumb() {
8594
let hub = fixture.getSut()
8695

0 commit comments

Comments
 (0)