Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 101 additions & 0 deletions packages/core/ios/RNSentry+fetchNativeStack.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
#import "RNSentry.h"
#import "RNSentryBreadcrumb.h"
#import "RNSentryId.h"
#import <Sentry/PrivateSentrySDKOnly.h>
#import <Sentry/SentryAppStartMeasurement.h>
#import <Sentry/SentryBreadcrumb.h>
#import <Sentry/SentryDebugImageProvider+HybridSDKs.h>
#import <Sentry/SentryDebugMeta.h>
#import <Sentry/SentryDependencyContainer.h>
#import <Sentry/SentryEvent.h>
#import <Sentry/SentryException.h>
#import <Sentry/SentryFormatter.h>
#import <Sentry/SentryOptions.h>
#import <Sentry/SentryUser.h>
@import Sentry;

// This method was moved to a new category so we can use `@import Sentry` to use Sentry's Swift
// classes
@implementation
RNSentry (fetchNativeStack)

- (NSDictionary *)fetchNativeStackFramesBy:(NSArray<NSNumber *> *)instructionsAddr
symbolicate:(SymbolicateCallbackType)symbolicate
{
#if CROSS_PLATFORM_TEST
BOOL shouldSymbolicateLocally = [SentrySDKInternal.options debug];
#else
BOOL shouldSymbolicateLocally = [SentrySDK.options debug];
#endif
NSString *appPackageName = [[NSBundle mainBundle] executablePath];

NSMutableSet<NSString *> *_Nonnull imagesAddrToRetrieveDebugMetaImages =
[[NSMutableSet alloc] init];
NSMutableArray<NSDictionary<NSString *, id> *> *_Nonnull serializedFrames =
[[NSMutableArray alloc] init];

for (NSNumber *addr in instructionsAddr) {
SentryBinaryImageInfo *_Nullable image = [[[SentryDependencyContainer sharedInstance]
binaryImageCache] imageByAddress:[addr unsignedLongLongValue]];
if (image != nil) {
NSString *imageAddr = sentry_formatHexAddressUInt64([image address]);
[imagesAddrToRetrieveDebugMetaImages addObject:imageAddr];

NSDictionary<NSString *, id> *_Nonnull nativeFrame = @{
@"platform" : @"cocoa",
@"instruction_addr" : sentry_formatHexAddress(addr),
@"package" : [image name],
@"image_addr" : imageAddr,
@"in_app" : [NSNumber numberWithBool:[appPackageName isEqualToString:[image name]]],
};

if (shouldSymbolicateLocally) {
Dl_info symbolsBuffer;
bool symbols_succeed = false;
symbols_succeed
= symbolicate((void *)[addr unsignedLongLongValue], &symbolsBuffer) != 0;
if (symbols_succeed) {
NSMutableDictionary<NSString *, id> *_Nonnull symbolicated
= nativeFrame.mutableCopy;
symbolicated[@"symbol_addr"]
= sentry_formatHexAddressUInt64((uintptr_t)symbolsBuffer.dli_saddr);
symbolicated[@"function"] = [NSString stringWithCString:symbolsBuffer.dli_sname
encoding:NSUTF8StringEncoding];

nativeFrame = symbolicated;
}
}

[serializedFrames addObject:nativeFrame];
} else {
[serializedFrames addObject:@{
@"platform" : @"cocoa",
@"instruction_addr" : sentry_formatHexAddress(addr),
}];
}
}

if (shouldSymbolicateLocally) {
return @{
@"frames" : serializedFrames,
};
} else {
NSMutableArray<NSDictionary<NSString *, id> *> *_Nonnull serializedDebugMetaImages =
[[NSMutableArray alloc] init];

NSArray<SentryDebugMeta *> *debugMetaImages =
[[[SentryDependencyContainer sharedInstance] debugImageProvider]
getDebugImagesForImageAddressesFromCache:imagesAddrToRetrieveDebugMetaImages];

for (SentryDebugMeta *debugImage in debugMetaImages) {
[serializedDebugMetaImages addObject:[debugImage serialize]];
}

return @{
@"frames" : serializedFrames,
@"debugMetaImages" : serializedDebugMetaImages,
};
}
}

@end
5 changes: 5 additions & 0 deletions packages/core/ios/RNSentry.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ SentrySDK (Private)

- (void)setEventOriginTag:(SentryEvent *)event;

@end

@interface
RNSentry (fetchNativeStack)

- (NSDictionary *_Nonnull)fetchNativeStackFramesBy:(NSArray<NSNumber *> *)instructionsAddr
symbolicate:(SymbolicateCallbackType)symbolicate;

Expand Down
81 changes: 1 addition & 80 deletions packages/core/ios/RNSentry.mm
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
#import "RNSentryId.h"
#import <Sentry/PrivateSentrySDKOnly.h>
#import <Sentry/SentryAppStartMeasurement.h>
#import <Sentry/SentryBinaryImageCache.h>
#import <Sentry/SentryBreadcrumb.h>
#import <Sentry/SentryDebugImageProvider+HybridSDKs.h>
#import <Sentry/SentryDebugMeta.h>
Expand All @@ -30,6 +29,7 @@
#import <Sentry/SentryFormatter.h>
#import <Sentry/SentryOptions.h>
#import <Sentry/SentryUser.h>

#if __has_include(<Sentry/SentryOptions+HybridSDKs.h>)
# define USE_SENTRY_OPTIONS 1
# import <Sentry/SentryOptions+HybridSDKs.h>
Expand Down Expand Up @@ -358,85 +358,6 @@ - (void)stopObserving
return packageName;
}

- (NSDictionary *)fetchNativeStackFramesBy:(NSArray<NSNumber *> *)instructionsAddr
symbolicate:(SymbolicateCallbackType)symbolicate
{
#if CROSS_PLATFORM_TEST
BOOL shouldSymbolicateLocally = [SentrySDKInternal.options debug];
#else
BOOL shouldSymbolicateLocally = [SentrySDK.options debug];
#endif
NSString *appPackageName = [[NSBundle mainBundle] executablePath];

NSMutableSet<NSString *> *_Nonnull imagesAddrToRetrieveDebugMetaImages =
[[NSMutableSet alloc] init];
NSMutableArray<NSDictionary<NSString *, id> *> *_Nonnull serializedFrames =
[[NSMutableArray alloc] init];

for (NSNumber *addr in instructionsAddr) {
SentryBinaryImageInfo *_Nullable image = [[[SentryDependencyContainer sharedInstance]
binaryImageCache] imageByAddress:[addr unsignedLongLongValue]];
if (image != nil) {
NSString *imageAddr = sentry_formatHexAddressUInt64([image address]);
[imagesAddrToRetrieveDebugMetaImages addObject:imageAddr];

NSDictionary<NSString *, id> *_Nonnull nativeFrame = @{
@"platform" : @"cocoa",
@"instruction_addr" : sentry_formatHexAddress(addr),
@"package" : [image name],
@"image_addr" : imageAddr,
@"in_app" : [NSNumber numberWithBool:[appPackageName isEqualToString:[image name]]],
};

if (shouldSymbolicateLocally) {
Dl_info symbolsBuffer;
bool symbols_succeed = false;
symbols_succeed
= symbolicate((void *)[addr unsignedLongLongValue], &symbolsBuffer) != 0;
if (symbols_succeed) {
NSMutableDictionary<NSString *, id> *_Nonnull symbolicated
= nativeFrame.mutableCopy;
symbolicated[@"symbol_addr"]
= sentry_formatHexAddressUInt64((uintptr_t)symbolsBuffer.dli_saddr);
symbolicated[@"function"] = [NSString stringWithCString:symbolsBuffer.dli_sname
encoding:NSUTF8StringEncoding];

nativeFrame = symbolicated;
}
}

[serializedFrames addObject:nativeFrame];
} else {
[serializedFrames addObject:@{
@"platform" : @"cocoa",
@"instruction_addr" : sentry_formatHexAddress(addr),
}];
}
}

if (shouldSymbolicateLocally) {
return @{
@"frames" : serializedFrames,
};
} else {
NSMutableArray<NSDictionary<NSString *, id> *> *_Nonnull serializedDebugMetaImages =
[[NSMutableArray alloc] init];

NSArray<SentryDebugMeta *> *debugMetaImages =
[[[SentryDependencyContainer sharedInstance] debugImageProvider]
getDebugImagesForImageAddressesFromCache:imagesAddrToRetrieveDebugMetaImages];

for (SentryDebugMeta *debugImage in debugMetaImages) {
[serializedDebugMetaImages addObject:[debugImage serialize]];
}

return @{
@"frames" : serializedFrames,
@"debugMetaImages" : serializedDebugMetaImages,
};
}
}

RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSDictionary *, fetchNativeStackFramesBy
: (NSArray *)instructionsAddr)
{
Expand Down
Loading