diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4ac3fd9e0..a19fdb61a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,12 +22,20 @@ jobs: target: IOS runsOn: ubuntu-latest - macos-sdk: + macos-cocoa-sdk: uses: ./.github/workflows/sdk-download.yml with: target: Mac + backend: cocoa runsOn: ubuntu-latest + macos-native-sdk: + uses: ./.github/workflows/sdk-build.yml + with: + target: Mac + backend: native + runsOn: macos-latest + linux-sdk-crashpad: uses: ./.github/workflows/sdk-build.yml with: @@ -116,8 +124,15 @@ jobs: runsOn: ubuntu-latest runtimeId: linux-arm64 + crash-reporter-mac: + uses: ./.github/workflows/crash-reporter-build.yml + with: + target: Mac + runsOn: macos-latest + runtimeId: osx-arm64 + package-preparation: - needs: [android-sdk, ios-sdk, macos-sdk, linux-sdk-crashpad, linux-sdk-native, linux-arm64-sdk-crashpad, linux-arm64-sdk-native, windows-sdk-crashpad, windows-sdk-native, windows-arm64-sdk-crashpad, windows-arm64-sdk-native, crash-reporter-win64, crash-reporter-win-arm64, crash-reporter-linux, crash-reporter-linux-arm64] + needs: [android-sdk, ios-sdk, macos-cocoa-sdk, macos-native-sdk, linux-sdk-crashpad, linux-sdk-native, linux-arm64-sdk-crashpad, linux-arm64-sdk-native, windows-sdk-crashpad, windows-sdk-native, windows-arm64-sdk-crashpad, windows-arm64-sdk-native, crash-reporter-win64, crash-reporter-win-arm64, crash-reporter-linux, crash-reporter-linux-arm64, crash-reporter-mac] name: Package runs-on: ubuntu-latest steps: @@ -142,9 +157,14 @@ jobs: - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: - name: Mac-sdk + name: Mac-cocoa-sdk path: plugin-dev/Source/ThirdParty/Mac + - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 + with: + name: Mac-native-sdk + path: plugin-dev/Source/ThirdParty/Mac/Native + - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: name: Linux-crashpad-sdk @@ -205,6 +225,11 @@ jobs: name: CrashReporter-LinuxArm64 path: plugin-dev/Source/ThirdParty/LinuxArm64 + - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 + with: + name: CrashReporter-Mac + path: plugin-dev/Source/ThirdParty/Mac + # Workaround for https://github.com/actions/download-artifact/issues/14 # Adding execute permission for crashpad before preparing final packages # allows to avoid issues with plugin initialization on Unix-based systems. @@ -217,6 +242,8 @@ jobs: chmod +x plugin-dev/Source/ThirdParty/LinuxArm64/Crashpad/bin/crashpad_handler chmod +x plugin-dev/Source/ThirdParty/LinuxArm64/Native/bin/sentry-crash chmod +x plugin-dev/Source/ThirdParty/LinuxArm64/Sentry.CrashReporter + chmod +x plugin-dev/Source/ThirdParty/Mac/Native/bin/sentry-crash + chmod +x plugin-dev/Source/ThirdParty/Mac/Sentry.CrashReporter - name: Prepare Sentry packages for release shell: pwsh diff --git a/.github/workflows/sdk-download.yml b/.github/workflows/sdk-download.yml index 423abfafc..3101af082 100644 --- a/.github/workflows/sdk-download.yml +++ b/.github/workflows/sdk-download.yml @@ -7,6 +7,10 @@ on: target: required: true type: string + backend: + required: false + type: string + default: "" jobs: download: @@ -22,6 +26,7 @@ jobs: id: env env: TARGET: ${{ inputs.target }} + BACKEND: ${{ inputs.backend }} run: | if [[ "$TARGET" == "IOS" || "$TARGET" == "Mac" ]]; then echo "cacheLocation=modules/sentry-cocoa" >> $GITHUB_OUTPUT @@ -30,6 +35,12 @@ jobs: fi echo "path=plugin-dev/Source/ThirdParty/$TARGET" >> $GITHUB_OUTPUT + if [[ -n "$BACKEND" ]]; then + echo "artifactName=${TARGET}-${BACKEND}-sdk" >> $GITHUB_OUTPUT + else + echo "artifactName=${TARGET}-sdk" >> $GITHUB_OUTPUT + fi + - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5 id: cache with: @@ -49,6 +60,6 @@ jobs: - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 with: - name: ${{ inputs.target }}-sdk + name: ${{ steps.env.outputs.artifactName }} path: ${{ steps.env.outputs.path }} retention-days: ${{ github.ref_name == 'main' && 14 || 1 }} diff --git a/CHANGELOG.md b/CHANGELOG.md index a2b709283..63967b915 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Features - Add out-of-process screenshot capturing on Windows ([#1325](https://github.com/getsentry/sentry-unreal/pull/1325)) +- Add native backend support for Mac ([#1333](https://github.com/getsentry/sentry-unreal/pull/1333)) ### Fixes diff --git a/integration-test/Integration.Desktop.Tests.ps1 b/integration-test/Integration.Desktop.Tests.ps1 index 85a14e52a..d49d209bd 100644 --- a/integration-test/Integration.Desktop.Tests.ps1 +++ b/integration-test/Integration.Desktop.Tests.ps1 @@ -43,11 +43,17 @@ BeforeDiscovery { # Detect native backend by checking which crash handler binary exists in the packaged build function Test-NativeBackend { $appDir = Split-Path $env:SENTRY_UNREAL_TEST_APP_PATH - $pluginBinDir = Join-Path $appDir "SentryPlayground/Plugins/sentry/Binaries" + if ($IsMacOS) { + $pluginBinDir = Join-Path (Split-Path $appDir) "UE/SentryPlayground/Plugins/sentry/Binaries" + } else { + $pluginBinDir = Join-Path $appDir "SentryPlayground/Plugins/sentry/Binaries" + } if ($IsWindows) { return Test-Path (Join-Path $pluginBinDir "Win64/sentry-crash.exe") } elseif ($IsLinux) { return Test-Path (Join-Path $pluginBinDir "Linux/sentry-crash") + } elseif ($IsMacOS) { + return Test-Path (Join-Path $pluginBinDir "Mac/sentry-crash") } else { return $false } @@ -59,7 +65,7 @@ BeforeDiscovery { $currentPlatform | Should -Not -Be $null $TestTargets += Get-TestTarget -Platform $currentPlatform -ProviderName $currentPlatform - $IsNativeBackend = Test-NativeBackend + $script:IsNativeBackend = Test-NativeBackend # Define crash types to test $TestCrashTypes = @( @@ -70,8 +76,8 @@ BeforeDiscovery { @{ Name = 'OutOfMemory'; Arg = '-crash-oom'; Type = 'OutOfMemory' } ) - if ($IsLinux) { - # Memory overcommit makes OOM conditions unreliable to trigger in tests on Linux + if ($IsLinux -or ($IsMacOS -and $IsNativeBackend)) { + # Memory overcommit makes OOM conditions unreliable to trigger in tests on Linux and macOS with native backend $TestCrashTypes = $TestCrashTypes | Where-Object { $_.Name -ne 'OutOfMemory' } } } @@ -164,10 +170,11 @@ Describe "Sentry Unreal Desktop Integration Tests ()" -ForEach $TestTa # $crashTypeArg triggers specific crash type scenario in the sample app $script:CrashResult = Invoke-DeviceApp -ExecutablePath $script:AppPath -Arguments ((@($crashTypeArg) + $appArgs) -join ' ') - # On macOS, the crash is captured but not uploaded immediately (due to Cocoa's behavior), + # On macOS with Cocoa backend, the crash is captured but not uploaded immediately, # so we need to run the test app again to send it to Sentry. - # -init-only allows starting the app to flush captured events and quit right after - if ($Platform -eq 'MacOS') { + # -init-only allows starting the app to flush captured events and quit right after. + # With native backend, crashes are uploaded out-of-process so no relaunch is needed. + if ($Platform -eq 'MacOS' -and -not $IsNativeBackend) { Invoke-DeviceApp -ExecutablePath $script:AppPath -Arguments ((@('-init-only') + $appArgs) -join ' ') } @@ -211,7 +218,7 @@ Describe "Sentry Unreal Desktop Integration Tests ()" -ForEach $TestTa It "Should have correct event type and platform" { $script:CrashEvent.type | Should -Be 'error' - if ($Platform -eq 'MacOS') { + if ($Platform -eq 'MacOS' -and -not $IsNativeBackend) { $script:CrashEvent.platform | Should -Be 'cocoa' } else { @@ -242,7 +249,7 @@ Describe "Sentry Unreal Desktop Integration Tests ()" -ForEach $TestTa ($tags | Where-Object { $_.key -eq 'test.suite' }).value | Should -Be 'integration' } - It "Should have CrashType tag" -Skip:($Name -in @('OutOfMemory', 'MemoryCorruption') -or $Platform -eq 'MacOS') { + It "Should have CrashType tag" -Skip:($Name -in @('OutOfMemory', 'MemoryCorruption') -or ($Platform -eq 'MacOS' -and -not $IsNativeBackend)) { $tags = $script:CrashEvent.tags ($tags | Where-Object { $_.key -eq 'CrashType' }).value | Should -Be $Type } @@ -331,7 +338,7 @@ Describe "Sentry Unreal Desktop Integration Tests ()" -ForEach $TestTa It "Should have correct event type and platform" { $script:EnsureEvent.type | Should -Be 'error' - if ($Platform -eq 'MacOS') { + if ($Platform -eq 'MacOS' -and -not $IsNativeBackend) { $script:EnsureEvent.platform | Should -Be 'cocoa' } else { @@ -365,7 +372,7 @@ Describe "Sentry Unreal Desktop Integration Tests ()" -ForEach $TestTa ($tags | Where-Object { $_.key -eq 'test.suite' }).value | Should -Be 'integration' } - It "Should have CrashType tag" -Skip:($Platform -eq 'MacOS') { + It "Should have CrashType tag" -Skip:($Platform -eq 'MacOS' -and -not $IsNativeBackend) { $tags = $script:EnsureEvent.tags ($tags | Where-Object { $_.key -eq 'CrashType' }).value | Should -Be 'Ensure' } @@ -538,7 +545,7 @@ Describe "Sentry Unreal Desktop Integration Tests ()" -ForEach $TestTa } It "Should have correct platform" { - if ($Platform -eq 'MacOS') { + if ($Platform -eq 'MacOS' -and -not $IsNativeBackend) { $script:MessageEvent.platform | Should -Be 'cocoa' } else { @@ -551,7 +558,7 @@ Describe "Sentry Unreal Desktop Integration Tests ()" -ForEach $TestTa $script:MessageEvent.message.formatted | Should -Match 'Integration test message' } - It "Should have overridden release" -Skip:($Platform -eq 'MacOS') { + It "Should have overridden release" -Skip:($Platform -eq 'MacOS' -and -not $IsNativeBackend) { $script:MessageEvent.release.version | Should -Be 'test-release@1.0.0' } @@ -744,8 +751,8 @@ Describe "Sentry Unreal Desktop Integration Tests ()" -ForEach $TestTa } } - # Metrics are not supported on Apple platforms (macOS/iOS) - Context "Metrics Capture Tests" -Skip:$IsMacOS { + # Metrics are not supported on macOS with Cocoa backend + Context "Metrics Capture Tests" -Skip:($IsMacOS -and -not $IsNativeBackend) { BeforeAll { $script:MetricResult = $null $script:CapturedCounterMetrics = @() diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryAttachment.cpp b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryAttachment.cpp index eb1a52e88..47d72d03e 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryAttachment.cpp +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryAttachment.cpp @@ -2,6 +2,8 @@ #include "AppleSentryAttachment.h" +#if !USE_SENTRY_NATIVE + #include "Infrastructure/AppleSentryConverters.h" #include "Convenience/AppleSentryInclude.h" @@ -50,3 +52,5 @@ FString FAppleSentryAttachment::GetContentType() const { return FString(AttachmentApple.contentType); } + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryAttachment.h b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryAttachment.h index f362c82a4..ad8e7b140 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryAttachment.h +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryAttachment.h @@ -2,6 +2,8 @@ #pragma once +#if !USE_SENTRY_NATIVE + #include "Interface/SentryAttachmentInterface.h" @class SentryAttachment; @@ -25,3 +27,5 @@ class FAppleSentryAttachment : public ISentryAttachment }; typedef FAppleSentryAttachment FPlatformSentryAttachment; + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryBreadcrumb.cpp b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryBreadcrumb.cpp index 52d59499f..408627236 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryBreadcrumb.cpp +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryBreadcrumb.cpp @@ -2,6 +2,8 @@ #include "AppleSentryBreadcrumb.h" +#if !USE_SENTRY_NATIVE + #include "Infrastructure/AppleSentryConverters.h" #include "Convenience/AppleSentryInclude.h" @@ -76,3 +78,5 @@ ESentryLevel FAppleSentryBreadcrumb::GetLevel() const { return FAppleSentryConverters::SentryLevelToUnreal(BreadcrumbApple.level); } + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryBreadcrumb.h b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryBreadcrumb.h index cc5a1266a..1958b0e58 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryBreadcrumb.h +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryBreadcrumb.h @@ -2,6 +2,8 @@ #pragma once +#if !USE_SENTRY_NATIVE + #include "Interface/SentryBreadcrumbInterface.h" @class SentryBreadcrumb; @@ -31,3 +33,5 @@ class FAppleSentryBreadcrumb : public ISentryBreadcrumb }; typedef FAppleSentryBreadcrumb FPlatformSentryBreadcrumb; + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryEvent.cpp b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryEvent.cpp index ad314320f..30bd382b2 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryEvent.cpp +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryEvent.cpp @@ -1,6 +1,9 @@ // Copyright (c) 2025 Sentry. All Rights Reserved. #include "AppleSentryEvent.h" + +#if !USE_SENTRY_NATIVE + #include "AppleSentryId.h" #include "Infrastructure/AppleSentryConverters.h" @@ -212,3 +215,5 @@ bool FAppleSentryEvent::IsAnr() const return isErrorLevel && isAppHangException && isAppHangMechanism && isAppHangMessage; } + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryEvent.h b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryEvent.h index 486f22e96..cacc6e256 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryEvent.h +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryEvent.h @@ -2,6 +2,8 @@ #pragma once +#if !USE_SENTRY_NATIVE + #include "Interface/SentryEventInterface.h" @class SentryEvent; @@ -46,3 +48,5 @@ class FAppleSentryEvent : public ISentryEvent }; typedef FAppleSentryEvent FPlatformSentryEvent; + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryFeedback.cpp b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryFeedback.cpp index a5d2733cb..18fbf04c6 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryFeedback.cpp +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryFeedback.cpp @@ -2,6 +2,8 @@ #include "AppleSentryFeedback.h" +#if !USE_SENTRY_NATIVE + #include "AppleSentryAttachment.h" #include "AppleSentryId.h" @@ -95,3 +97,5 @@ SentryFeedback* FAppleSentryFeedback::CreateSentryFeedback(TSharedPtr> Attachments; }; -typedef FAppleSentryFeedback FPlatformSentryFeedback; \ No newline at end of file +typedef FAppleSentryFeedback FPlatformSentryFeedback; + +#endif // !USE_SENTRY_NATIVE \ No newline at end of file diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryId.cpp b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryId.cpp index 7e1011793..88b576e19 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryId.cpp +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryId.cpp @@ -2,6 +2,8 @@ #include "AppleSentryId.h" +#if !USE_SENTRY_NATIVE + #include "Convenience/AppleSentryInclude.h" #include "Convenience/AppleSentryMacro.h" @@ -34,3 +36,5 @@ FString FAppleSentryId::ToString() const { return FString(IdApple.sentryIdString); } + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryId.h b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryId.h index 95512faec..181eb3c4b 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryId.h +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryId.h @@ -2,6 +2,8 @@ #pragma once +#if !USE_SENTRY_NATIVE + #include "Interface/SentryIdInterface.h" @class SentryId; @@ -22,4 +24,6 @@ class FAppleSentryId : public ISentryId SentryId* IdApple; }; -typedef FAppleSentryId FPlatformSentryId; \ No newline at end of file +typedef FAppleSentryId FPlatformSentryId; + +#endif // !USE_SENTRY_NATIVE \ No newline at end of file diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryLog.cpp b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryLog.cpp index 966c268a7..0e79084bf 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryLog.cpp +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryLog.cpp @@ -2,6 +2,8 @@ #include "AppleSentryLog.h" +#if !USE_SENTRY_NATIVE + #include "Infrastructure/AppleSentryConverters.h" #include "Convenience/AppleSentryInclude.h" @@ -112,4 +114,6 @@ void FAppleSentryLog::AddAttributes(const TMap& attribu { SetAttribute(pair.Key, pair.Value); } -} \ No newline at end of file +} + +#endif // !USE_SENTRY_NATIVE \ No newline at end of file diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryLog.h b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryLog.h index 60faece5d..d20f154c1 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryLog.h +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryLog.h @@ -2,6 +2,8 @@ #pragma once +#if !USE_SENTRY_NATIVE + #include "Interface/SentryLogInterface.h" @class SentryLog; @@ -31,4 +33,6 @@ class FAppleSentryLog : public ISentryLog SentryLog* LogApple; }; -typedef FAppleSentryLog FPlatformSentryLog; \ No newline at end of file +typedef FAppleSentryLog FPlatformSentryLog; + +#endif // !USE_SENTRY_NATIVE \ No newline at end of file diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySamplingContext.cpp b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySamplingContext.cpp index fa88b0b5e..15fe30e2a 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySamplingContext.cpp +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySamplingContext.cpp @@ -1,6 +1,9 @@ // Copyright (c) 2025 Sentry. All Rights Reserved. #include "AppleSentrySamplingContext.h" + +#if !USE_SENTRY_NATIVE + #include "AppleSentryTransactionContext.h" #include "Infrastructure/AppleSentryConverters.h" @@ -31,3 +34,5 @@ SentrySamplingContext* FAppleSentrySamplingContext::GetNativeObject() { return SamplingContext; } + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySamplingContext.h b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySamplingContext.h index 65f9803cb..55147f072 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySamplingContext.h +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySamplingContext.h @@ -2,6 +2,8 @@ #pragma once +#if !USE_SENTRY_NATIVE + #include "Interface/SentrySamplingContextInterface.h" @class SentrySamplingContext; @@ -22,3 +24,5 @@ class FAppleSentrySamplingContext : public ISentrySamplingContext }; typedef FAppleSentrySamplingContext FPlatformSentrySamplingContext; + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryScope.cpp b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryScope.cpp index 852f06aa5..e62e92e82 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryScope.cpp +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryScope.cpp @@ -2,6 +2,8 @@ #include "AppleSentryScope.h" +#if !USE_SENTRY_NATIVE + #include "AppleSentryAttachment.h" #include "AppleSentryBreadcrumb.h" @@ -226,3 +228,5 @@ void FAppleSentryScope::Clear() { [ScopeApple clear]; } + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryScope.h b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryScope.h index 9bb7d93c7..a1a05c79d 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryScope.h +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryScope.h @@ -2,6 +2,8 @@ #pragma once +#if !USE_SENTRY_NATIVE + #include "Interface/SentryScopeInterface.h" @class SentryScope; @@ -46,3 +48,5 @@ class FAppleSentryScope : public ISentryScope }; typedef FAppleSentryScope FPlatformSentryScope; + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySpan.cpp b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySpan.cpp index dedf5e881..9d9ed8ec5 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySpan.cpp +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySpan.cpp @@ -2,6 +2,8 @@ #include "AppleSentrySpan.h" +#if !USE_SENTRY_NATIVE + #include "SentryDefines.h" #include "Infrastructure/AppleSentryConverters.h" @@ -88,3 +90,5 @@ void FAppleSentrySpan::GetTrace(FString& name, FString& value) name = TEXT("sentry-trace"); value = FString([traceHeader value]); } + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySpan.h b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySpan.h index d6940667d..60e375bac 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySpan.h +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySpan.h @@ -2,6 +2,8 @@ #pragma once +#if !USE_SENTRY_NATIVE + #include "Interface/SentrySpanInterface.h" @protocol SentrySpan; @@ -30,3 +32,5 @@ class FAppleSentrySpan : public ISentrySpan }; typedef FAppleSentrySpan FPlatformSentrySpan; + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.cpp b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.cpp index 209584f7c..abd4c9ae1 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.cpp +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.cpp @@ -2,6 +2,8 @@ #include "AppleSentrySubsystem.h" +#if !USE_SENTRY_NATIVE + #include "AppleSentryAttachment.h" #include "AppleSentryBreadcrumb.h" #include "AppleSentryEvent.h" @@ -699,3 +701,5 @@ FString FAppleSentrySubsystem::GetLatestScreenshot() const return Screenshots[0]; } + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.h b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.h index 0ab902ea0..7035311b7 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.h +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentrySubsystem.h @@ -2,6 +2,8 @@ #pragma once +#if !USE_SENTRY_NATIVE + #include "Interface/SentrySubsystemInterface.h" class FAppleSentrySubsystem : public ISentrySubsystem @@ -70,3 +72,5 @@ class FAppleSentrySubsystem : public ISentrySubsystem bool isScreenshotAttachmentEnabled = false; bool isGameLogAttachmentEnabled = false; }; + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransaction.cpp b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransaction.cpp index 827588a10..9e3f43e53 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransaction.cpp +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransaction.cpp @@ -1,6 +1,9 @@ // Copyright (c) 2025 Sentry. All Rights Reserved. #include "AppleSentryTransaction.h" + +#if !USE_SENTRY_NATIVE + #include "AppleSentrySpan.h" #include "Infrastructure/AppleSentryConverters.h" @@ -95,3 +98,5 @@ void FAppleSentryTransaction::GetTrace(FString& name, FString& value) name = TEXT("sentry-trace"); value = FString([traceHeader value]); } + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransaction.h b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransaction.h index f1ce15a85..7cb3c42d8 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransaction.h +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransaction.h @@ -2,6 +2,8 @@ #pragma once +#if !USE_SENTRY_NATIVE + #include "Interface/SentryTransactionInterface.h" @protocol SentrySpan; @@ -31,3 +33,5 @@ class FAppleSentryTransaction : public ISentryTransaction }; typedef FAppleSentryTransaction FPlatformSentryTransaction; + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransactionContext.cpp b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransactionContext.cpp index 68cf059de..0be41e385 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransactionContext.cpp +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransactionContext.cpp @@ -2,6 +2,8 @@ #include "AppleSentryTransactionContext.h" +#if !USE_SENTRY_NATIVE + #include "Convenience/AppleSentryInclude.h" #include "Convenience/AppleSentryMacro.h" @@ -34,3 +36,5 @@ SentryTransactionContext* FAppleSentryTransactionContext::GetNativeObject() { return TransactionContext; } + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransactionContext.h b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransactionContext.h index 8f03f354e..96f32928e 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransactionContext.h +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryTransactionContext.h @@ -2,6 +2,8 @@ #pragma once +#if !USE_SENTRY_NATIVE + #include "Interface/SentryTransactionContextInterface.h" @class SentryTransactionContext; @@ -23,3 +25,5 @@ class FAppleSentryTransactionContext : public ISentryTransactionContext }; typedef FAppleSentryTransactionContext FPlatformSentryTransactionContext; + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryUser.cpp b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryUser.cpp index 415f9a60b..60dcda55a 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryUser.cpp +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryUser.cpp @@ -2,6 +2,8 @@ #include "AppleSentryUser.h" +#if !USE_SENTRY_NATIVE + #include "Infrastructure/AppleSentryConverters.h" #include "Convenience/AppleSentryInclude.h" @@ -76,3 +78,5 @@ TMap FAppleSentryUser::GetData() { return FAppleSentryConverters::StringMapToUnreal(UserApple.data); } + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryUser.h b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryUser.h index da4f5cefc..0a32a3622 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/AppleSentryUser.h +++ b/plugin-dev/Source/Sentry/Private/Apple/AppleSentryUser.h @@ -2,6 +2,8 @@ #pragma once +#if !USE_SENTRY_NATIVE + #include "Interface/SentryUserInterface.h" @class SentryUser; @@ -31,3 +33,5 @@ class FAppleSentryUser : public ISentryUser }; typedef FAppleSentryUser FPlatformSentryUser; + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/Convenience/AppleSentryInclude.h b/plugin-dev/Source/Sentry/Private/Apple/Convenience/AppleSentryInclude.h index 00945e6ce..fd89b1bcf 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/Convenience/AppleSentryInclude.h +++ b/plugin-dev/Source/Sentry/Private/Apple/Convenience/AppleSentryInclude.h @@ -2,6 +2,8 @@ #pragma once +#if !USE_SENTRY_NATIVE + #include "HAL/Platform.h" #ifndef NS_SWIFT_SENDABLE @@ -16,4 +18,6 @@ #import #import #import -#endif \ No newline at end of file +#endif + +#endif // !USE_SENTRY_NATIVE \ No newline at end of file diff --git a/plugin-dev/Source/Sentry/Private/Apple/Convenience/AppleSentryMacro.h b/plugin-dev/Source/Sentry/Private/Apple/Convenience/AppleSentryMacro.h index f0eb91952..c2debaf9b 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/Convenience/AppleSentryMacro.h +++ b/plugin-dev/Source/Sentry/Private/Apple/Convenience/AppleSentryMacro.h @@ -2,6 +2,8 @@ #pragma once +#if !USE_SENTRY_NATIVE + #include "SentryModule.h" // clang-format off @@ -14,4 +16,6 @@ Name #endif -// clang-format on \ No newline at end of file +// clang-format on + +#endif // !USE_SENTRY_NATIVE \ No newline at end of file diff --git a/plugin-dev/Source/Sentry/Private/Apple/Infrastructure/AppleSentryConverters.cpp b/plugin-dev/Source/Sentry/Private/Apple/Infrastructure/AppleSentryConverters.cpp index 5f545351f..76f0cf4f6 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/Infrastructure/AppleSentryConverters.cpp +++ b/plugin-dev/Source/Sentry/Private/Apple/Infrastructure/AppleSentryConverters.cpp @@ -2,6 +2,8 @@ #include "AppleSentryConverters.h" +#if !USE_SENTRY_NATIVE + #include "SentryDefines.h" #include "Apple/AppleSentryScope.h" @@ -440,3 +442,5 @@ FSentryVariant FAppleSentryConverters::SentryAttributeToVariant(SentryAttribute* return FSentryVariant(FString([attribute.value description])); } } + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/Apple/Infrastructure/AppleSentryConverters.h b/plugin-dev/Source/Sentry/Private/Apple/Infrastructure/AppleSentryConverters.h index fc6e68636..b7cba1b95 100644 --- a/plugin-dev/Source/Sentry/Private/Apple/Infrastructure/AppleSentryConverters.h +++ b/plugin-dev/Source/Sentry/Private/Apple/Infrastructure/AppleSentryConverters.h @@ -2,6 +2,8 @@ #pragma once +#if !USE_SENTRY_NATIVE + #include "SentryDataTypes.h" #include "SentryVariant.h" @@ -40,3 +42,5 @@ class FAppleSentryConverters static SentryLevel StringToSentryLevel(NSString* string); static FSentryVariant SentryAttributeToVariant(SentryAttribute* attribute); }; + +#endif // !USE_SENTRY_NATIVE diff --git a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryAttachment.h b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryAttachment.h index 335a1c7b1..073bb430e 100644 --- a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryAttachment.h +++ b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryAttachment.h @@ -6,7 +6,7 @@ #if PLATFORM_ANDROID #include "Android/AndroidSentryAttachment.h" -#elif PLATFORM_APPLE +#elif PLATFORM_APPLE && !USE_SENTRY_NATIVE #include "Apple/AppleSentryAttachment.h" #elif USE_SENTRY_NATIVE #include "GenericPlatform/GenericPlatformSentryAttachment.h" diff --git a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryBreadcrumb.h b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryBreadcrumb.h index 9a80cf256..a5e633d4a 100644 --- a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryBreadcrumb.h +++ b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryBreadcrumb.h @@ -6,7 +6,7 @@ #if PLATFORM_ANDROID #include "Android/AndroidSentryBreadcrumb.h" -#elif PLATFORM_APPLE +#elif PLATFORM_APPLE && !USE_SENTRY_NATIVE #include "Apple/AppleSentryBreadcrumb.h" #elif USE_SENTRY_NATIVE #include "GenericPlatform/GenericPlatformSentryBreadcrumb.h" diff --git a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryEvent.h b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryEvent.h index aa7d9d54d..d1574394b 100644 --- a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryEvent.h +++ b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryEvent.h @@ -6,7 +6,7 @@ #if PLATFORM_ANDROID #include "Android/AndroidSentryEvent.h" -#elif PLATFORM_APPLE +#elif PLATFORM_APPLE && !USE_SENTRY_NATIVE #include "Apple/AppleSentryEvent.h" #elif USE_SENTRY_NATIVE #include "GenericPlatform/GenericPlatformSentryEvent.h" diff --git a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryFeedback.h b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryFeedback.h index 4181e6330..6ac5dd51b 100644 --- a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryFeedback.h +++ b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryFeedback.h @@ -6,7 +6,7 @@ #if PLATFORM_ANDROID #include "Android/AndroidSentryFeedback.h" -#elif PLATFORM_APPLE +#elif PLATFORM_APPLE && !USE_SENTRY_NATIVE #include "Apple/AppleSentryFeedback.h" #elif USE_SENTRY_NATIVE && PLATFORM_MICROSOFT #include "Microsoft/MicrosoftSentryFeedback.h" diff --git a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryId.h b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryId.h index 311a3ac7d..d64969987 100644 --- a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryId.h +++ b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryId.h @@ -6,7 +6,7 @@ #if PLATFORM_ANDROID #include "Android/AndroidSentryId.h" -#elif PLATFORM_APPLE +#elif PLATFORM_APPLE && !USE_SENTRY_NATIVE #include "Apple/AppleSentryId.h" #elif USE_SENTRY_NATIVE #include "GenericPlatform/GenericPlatformSentryId.h" diff --git a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryLog.h b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryLog.h index 99a428a65..1e387addc 100644 --- a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryLog.h +++ b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryLog.h @@ -6,7 +6,7 @@ #if PLATFORM_ANDROID #include "Android/AndroidSentryLog.h" -#elif PLATFORM_APPLE +#elif PLATFORM_APPLE && !USE_SENTRY_NATIVE #include "Apple/AppleSentryLog.h" #elif USE_SENTRY_NATIVE #include "GenericPlatform/GenericPlatformSentryLog.h" diff --git a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentrySamplingContext.h b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentrySamplingContext.h index 22502fe9d..167a1749e 100644 --- a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentrySamplingContext.h +++ b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentrySamplingContext.h @@ -6,7 +6,7 @@ #if PLATFORM_ANDROID #include "Android/AndroidSentrySamplingContext.h" -#elif PLATFORM_APPLE +#elif PLATFORM_APPLE && !USE_SENTRY_NATIVE #include "Apple/AppleSentrySamplingContext.h" #elif USE_SENTRY_NATIVE #include "GenericPlatform/GenericPlatformSentrySamplingContext.h" diff --git a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryScope.h b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryScope.h index 74efd00db..3ad21234a 100644 --- a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryScope.h +++ b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryScope.h @@ -6,7 +6,7 @@ #if PLATFORM_ANDROID #include "Android/AndroidSentryScope.h" -#elif PLATFORM_APPLE +#elif PLATFORM_APPLE && !USE_SENTRY_NATIVE #include "Apple/AppleSentryScope.h" #elif USE_SENTRY_NATIVE && PLATFORM_MICROSOFT #include "Microsoft/MicrosoftSentryScope.h" diff --git a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentrySpan.h b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentrySpan.h index 6cb92a1ce..9c5ee805f 100644 --- a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentrySpan.h +++ b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentrySpan.h @@ -6,7 +6,7 @@ #if PLATFORM_ANDROID #include "Android/AndroidSentrySpan.h" -#elif PLATFORM_APPLE +#elif PLATFORM_APPLE && !USE_SENTRY_NATIVE #include "Apple/AppleSentrySpan.h" #elif USE_SENTRY_NATIVE #include "GenericPlatform/GenericPlatformSentrySpan.h" diff --git a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryTransaction.h b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryTransaction.h index 457236f92..1ffac15e5 100644 --- a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryTransaction.h +++ b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryTransaction.h @@ -6,7 +6,7 @@ #if PLATFORM_ANDROID #include "Android/AndroidSentryTransaction.h" -#elif PLATFORM_APPLE +#elif PLATFORM_APPLE && !USE_SENTRY_NATIVE #include "Apple/AppleSentryTransaction.h" #elif USE_SENTRY_NATIVE #include "GenericPlatform/GenericPlatformSentryTransaction.h" diff --git a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryTransactionContext.h b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryTransactionContext.h index d2125e85d..f3d356497 100644 --- a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryTransactionContext.h +++ b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryTransactionContext.h @@ -6,7 +6,7 @@ #if PLATFORM_ANDROID #include "Android/AndroidSentryTransactionContext.h" -#elif PLATFORM_APPLE +#elif PLATFORM_APPLE && !USE_SENTRY_NATIVE #include "Apple/AppleSentryTransactionContext.h" #elif USE_SENTRY_NATIVE #include "GenericPlatform/GenericPlatformSentryTransactionContext.h" diff --git a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryUser.h b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryUser.h index d03cbcc44..2352f0ad3 100644 --- a/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryUser.h +++ b/plugin-dev/Source/Sentry/Private/HAL/PlatformSentryUser.h @@ -6,7 +6,7 @@ #if PLATFORM_ANDROID #include "Android/AndroidSentryUser.h" -#elif PLATFORM_APPLE +#elif PLATFORM_APPLE && !USE_SENTRY_NATIVE #include "Apple/AppleSentryUser.h" #elif USE_SENTRY_NATIVE #include "GenericPlatform/GenericPlatformSentryUser.h" diff --git a/plugin-dev/Source/Sentry/Private/Mac/MacSentrySubsystem.cpp b/plugin-dev/Source/Sentry/Private/Mac/MacSentrySubsystem.cpp index f13638412..b9d1f2eed 100644 --- a/plugin-dev/Source/Sentry/Private/Mac/MacSentrySubsystem.cpp +++ b/plugin-dev/Source/Sentry/Private/Mac/MacSentrySubsystem.cpp @@ -2,17 +2,102 @@ #include "Mac/MacSentrySubsystem.h" +#include "SentryDefines.h" +#include "SentrySettings.h" + +#include "Misc/Paths.h" + +#if USE_SENTRY_NATIVE + +#include "GenericPlatform/GenericPlatformOutputDevices.h" + +void FMacSentrySubsystem::InitWithSettings(const USentrySettings* Settings, const FSentryCallbackHandlers& CallbackHandlers) +{ + FGenericPlatformSentrySubsystem::InitWithSettings(Settings, CallbackHandlers); + + if (Settings->EnableExternalCrashReporter) + { + ConfigureCrashReporterAppearance(Settings); + } + + if (Settings->EnableCrashReporterContextPropagation) + { + InitCrashReporter(Settings->GetEffectiveRelease(), Settings->GetEffectiveEnvironment()); + } +} + +FString FMacSentrySubsystem::GetHandlerExecutableName() const +{ + return TEXT("sentry-crash"); +} + +void FMacSentrySubsystem::ConfigureHandlerPath(sentry_options_t* Options) +{ + const FString HandlerPath = GetHandlerPath(); + + if (!FPaths::FileExists(HandlerPath)) + { + UE_LOG(LogSentrySdk, Error, TEXT("Crash handler executable couldn't be found at: %s"), *HandlerPath); + return; + } + + sentry_options_set_handler_path(Options, TCHAR_TO_UTF8(*HandlerPath)); +} + +void FMacSentrySubsystem::ConfigureDatabasePath(sentry_options_t* Options) +{ + sentry_options_set_database_path(Options, TCHAR_TO_UTF8(*GetDatabasePath())); +} + +void FMacSentrySubsystem::ConfigureCertsPath(sentry_options_t* Options) +{ + // UE's bundled libcurl uses OpenSSL which requires explicit CA certificate paths on macOS + static const char* KnownCertPaths[] = { + "/etc/ssl/cert.pem", + }; + + for (const char* BundlePath : KnownCertPaths) + { + FString FileName(BundlePath); + + if (FPaths::FileExists(FileName)) + { + UE_LOG(LogSentrySdk, Log, TEXT("Sentry transport will use the certificate found at %s for verification."), *FileName); + sentry_options_set_ca_certs(Options, BundlePath); + return; + } + } + + UE_LOG(LogSentrySdk, Warning, TEXT("Could not find CA certificates in any known location. Sentry transport may not function properly for handled events")); +} + +void FMacSentrySubsystem::ConfigureLogFileAttachment(sentry_options_t* Options) +{ + const FString LogFilePath = FGenericPlatformOutputDevices::GetAbsoluteLogFilename(); + sentry_options_add_attachment(Options, TCHAR_TO_UTF8(*FPaths::ConvertRelativePathToFull(LogFilePath))); +} + +void FMacSentrySubsystem::ConfigureCrashReporterPath(sentry_options_t* Options) +{ + const FString CrashReporterPath = GetCrashReporterPath(); + if (!FPaths::FileExists(CrashReporterPath)) + { + UE_LOG(LogSentrySdk, Error, TEXT("External crash reporter executable couldn't be found at: %s"), *CrashReporterPath); + return; + } + sentry_options_set_external_crash_reporter_path(Options, TCHAR_TO_UTF8(*CrashReporterPath)); +} + +#else + #include "AppleSentryId.h" -#include "SentryDefines.h" #include "SentryModule.h" -#include "SentrySettings.h" #include "Utils/SentryFileUtils.h" #include "Misc/CoreDelegates.h" #include "Misc/FileHelper.h" -#include "Misc/Paths.h" void FMacSentrySubsystem::InitWithSettings(const USentrySettings* settings, const FSentryCallbackHandlers& callbackHandlers) { @@ -103,3 +188,5 @@ FString FMacSentrySubsystem::GetLatestGameLog() const { return SentryFileUtils::GetGameLogBackupPath(); } + +#endif diff --git a/plugin-dev/Source/Sentry/Private/Mac/MacSentrySubsystem.h b/plugin-dev/Source/Sentry/Private/Mac/MacSentrySubsystem.h index 85032cc8b..333070dd7 100644 --- a/plugin-dev/Source/Sentry/Private/Mac/MacSentrySubsystem.h +++ b/plugin-dev/Source/Sentry/Private/Mac/MacSentrySubsystem.h @@ -2,6 +2,33 @@ #pragma once +#if USE_SENTRY_NATIVE + +#include "GenericPlatform/GenericPlatformSentrySubsystem.h" + +class FMacSentrySubsystem : public FGenericPlatformSentrySubsystem +{ +public: + virtual void InitWithSettings(const USentrySettings* settings, const FSentryCallbackHandlers& callbackHandlers) override; + +protected: + virtual void ConfigureHandlerPath(sentry_options_t* Options) override; + virtual void ConfigureDatabasePath(sentry_options_t* Options) override; + virtual void ConfigureCertsPath(sentry_options_t* Options) override; + virtual void ConfigureLogFileAttachment(sentry_options_t* Options) override; + virtual void ConfigureCrashReporterPath(sentry_options_t* Options) override; + + virtual FString GetHandlerExecutableName() const override; + virtual FString GetCrashReporterExecutableName() const override { return TEXT("Sentry.CrashReporter"); } + + virtual bool IsScreenshotSupported() const override { return true; } + virtual bool IsHangTrackingSupported() const override { return false; } + + virtual FString GetDeviceType() const override { return TEXT("Desktop"); } +}; + +#else + #include "Apple/AppleSentrySubsystem.h" class FMacSentrySubsystem : public FAppleSentrySubsystem @@ -24,4 +51,6 @@ class FMacSentrySubsystem : public FAppleSentrySubsystem FDelegateHandle OnHandleSystemErrorDelegateHandle; }; +#endif + typedef FMacSentrySubsystem FPlatformSentrySubsystem; diff --git a/plugin-dev/Source/Sentry/Private/SentryModule.cpp b/plugin-dev/Source/Sentry/Private/SentryModule.cpp index 4b1362c39..d94716537 100644 --- a/plugin-dev/Source/Sentry/Private/SentryModule.cpp +++ b/plugin-dev/Source/Sentry/Private/SentryModule.cpp @@ -22,7 +22,7 @@ void FSentryModule::StartupModule() SentrySettings = NewObject(GetTransientPackage(), "SentrySettings", RF_Standalone); SentrySettings->AddToRoot(); -#if PLATFORM_MAC +#if PLATFORM_MAC && !USE_SENTRY_NATIVE // Load Sentry Cocoa dynamic library FString LibraryPath = FPaths::Combine(GetBinariesPath(), TEXT("sentry.dylib")); mDllHandleSentry = FPlatformProcess::GetDllHandle(*LibraryPath); @@ -47,7 +47,7 @@ void FSentryModule::ShutdownModule() // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, // we call this function before unloading the module. -#if PLATFORM_MAC +#if PLATFORM_MAC && !USE_SENTRY_NATIVE // Free sentry dynamic library if (mDllHandleSentry) { @@ -141,7 +141,7 @@ bool FSentryModule::IsMarketplaceVersion() return PluginPath.StartsWith(MarketplacePrefix); } -#if PLATFORM_MAC +#if PLATFORM_MAC && !USE_SENTRY_NATIVE void* FSentryModule::GetSentryLibHandle() const { diff --git a/plugin-dev/Source/Sentry/Private/Tests/SentryLog.spec.cpp b/plugin-dev/Source/Sentry/Private/Tests/SentryLog.spec.cpp index 87f3a97bb..e751a888b 100644 --- a/plugin-dev/Source/Sentry/Private/Tests/SentryLog.spec.cpp +++ b/plugin-dev/Source/Sentry/Private/Tests/SentryLog.spec.cpp @@ -61,7 +61,7 @@ void SentryLogSpec::Define() TestEqual("Fatal level", SentryLog->GetLevel(), ESentryLevel::Fatal); // Test invalid level falls back to Debug -#if PLATFORM_APPLE +#if PLATFORM_APPLE && !USE_SENTRY_NATIVE AddExpectedError(TEXT("Unknown Sentry level value used"), EAutomationExpectedErrorFlags::Contains, 0); #endif SentryLog->SetLevel(static_cast(18)); diff --git a/plugin-dev/Source/Sentry/Public/SentryModule.h b/plugin-dev/Source/Sentry/Public/SentryModule.h index 598e8da69..709614883 100644 --- a/plugin-dev/Source/Sentry/Public/SentryModule.h +++ b/plugin-dev/Source/Sentry/Public/SentryModule.h @@ -44,7 +44,7 @@ class SENTRY_API FSentryModule : public IModuleInterface /** Gets flag indicating whether plugin was downloaded from UE Marketplace. */ static bool IsMarketplaceVersion(); -#if PLATFORM_MAC +#if PLATFORM_MAC && !USE_SENTRY_NATIVE /** Gets handle to dynamically loaded sentry library. */ void* GetSentryLibHandle() const; @@ -69,7 +69,7 @@ class SENTRY_API FSentryModule : public IModuleInterface private: USentrySettings* SentrySettings = nullptr; -#if PLATFORM_MAC +#if PLATFORM_MAC && !USE_SENTRY_NATIVE void* mDllHandleSentry = nullptr; #endif }; diff --git a/plugin-dev/Source/Sentry/Public/SentrySettings.h b/plugin-dev/Source/Sentry/Public/SentrySettings.h index e790cd1ce..4a1519254 100644 --- a/plugin-dev/Source/Sentry/Public/SentrySettings.h +++ b/plugin-dev/Source/Sentry/Public/SentrySettings.h @@ -449,7 +449,7 @@ class SENTRY_API USentrySettings : public UObject ESentryDatabaseLocation DatabaseLocation; UPROPERTY(Config, EditAnywhere, Category = "General|Native", - Meta = (DisplayName = "Use native crash backend (Experimental)", ToolTip = "Use the experimental native backend for crash reporting on Windows and Linux instead of the default Crashpad backend. Requires rebuild after changing.", + Meta = (DisplayName = "Use native crash backend (Experimental)", ToolTip = "Use the experimental native backend for crash reporting on Windows, Linux, and macOS instead of the default backend (Crashpad on Windows/Linux, sentry-cocoa on macOS). Requires rebuild after changing.", ConfigRestartRequired = true)) bool UseNativeBackend; diff --git a/plugin-dev/Source/Sentry/Sentry.Build.cs b/plugin-dev/Source/Sentry/Sentry.Build.cs index 26d40ed6b..836ca5bb0 100644 --- a/plugin-dev/Source/Sentry/Sentry.Build.cs +++ b/plugin-dev/Source/Sentry/Sentry.Build.cs @@ -78,19 +78,42 @@ public Sentry(ReadOnlyTargetRules Target) : base(Target) } else if (Target.Platform == UnrealTargetPlatform.Mac) { - PrivateIncludePaths.Add(Path.Combine(ModuleDirectory, "Private", "Apple")); + if (bUseNativeBackend) + { + PublicIncludePaths.Add(Path.Combine(PlatformThirdPartyPath, "Native", "include")); - PublicIncludePaths.Add(Path.Combine(PlatformThirdPartyPath, "include")); + PublicAdditionalLibraries.Add(Path.Combine(PlatformThirdPartyPath, "Native", "lib", "libsentry.a")); - RuntimeDependencies.Add(Path.Combine(PlatformBinariesPath, "sentry.dylib"), Path.Combine(PlatformThirdPartyPath, "bin", "sentry.dylib")); + RuntimeDependencies.Add(Path.Combine(PlatformBinariesPath, "sentry-crash"), Path.Combine(PlatformThirdPartyPath, "Native", "bin", "sentry-crash")); - PublicDefinitions.Add("USE_SENTRY_NATIVE=0"); - PublicDefinitions.Add("COCOAPODS=0"); - PublicDefinitions.Add("SENTRY_NO_UIKIT=1"); - PublicDefinitions.Add("SENTRY_NO_UI_FRAMEWORK=0"); - PublicDefinitions.Add("APPLICATION_EXTENSION_API_ONLY_NO=0"); - PublicDefinitions.Add("SDK_V9=0"); - PublicDefinitions.Add("SWIFT_PACKAGE=0"); + if (bEnableExternalCrashReporter) + { + RuntimeDependencies.Add(Path.Combine(PlatformBinariesPath, "Sentry.CrashReporter"), Path.Combine(PlatformThirdPartyPath, "Sentry.CrashReporter")); + } + + PublicDefinitions.Add("USE_SENTRY_NATIVE=1"); + PublicDefinitions.Add("SENTRY_BUILD_STATIC=1"); + + AddEngineThirdPartyPrivateStaticDependencies(Target, "libcurl"); + AddEngineThirdPartyPrivateStaticDependencies(Target, "OpenSSL"); + AddEngineThirdPartyPrivateStaticDependencies(Target, "nghttp2"); + } + else + { + PrivateIncludePaths.Add(Path.Combine(ModuleDirectory, "Private", "Apple")); + + PublicIncludePaths.Add(Path.Combine(PlatformThirdPartyPath, "Cocoa", "include")); + + RuntimeDependencies.Add(Path.Combine(PlatformBinariesPath, "sentry.dylib"), Path.Combine(PlatformThirdPartyPath, "Cocoa", "bin", "sentry.dylib")); + + PublicDefinitions.Add("USE_SENTRY_NATIVE=0"); + PublicDefinitions.Add("COCOAPODS=0"); + PublicDefinitions.Add("SENTRY_NO_UIKIT=1"); + PublicDefinitions.Add("SENTRY_NO_UI_FRAMEWORK=0"); + PublicDefinitions.Add("APPLICATION_EXTENSION_API_ONLY_NO=0"); + PublicDefinitions.Add("SDK_V9=0"); + PublicDefinitions.Add("SWIFT_PACKAGE=0"); + } } else if (Target.Platform == UnrealTargetPlatform.Android) { diff --git a/scripts/build-deps.ps1 b/scripts/build-deps.ps1 index ac8256c0e..f17031ce1 100755 --- a/scripts/build-deps.ps1 +++ b/scripts/build-deps.ps1 @@ -53,6 +53,7 @@ if ($All) else { $Cocoa = $true + $Native = $true $Java = $true $CrashReporter = $true } @@ -212,16 +213,16 @@ function buildSentryCocoaMac() extractXCFramework "$CocoaPath/XCFrameworkBuildPath/Sentry-Dynamic.xcframework.zip" $tempExtractDir # Prepare output directories - $macOutDir = "$outDir/Mac" - $macOutDirBinaries = "$macOutDir/bin" - $macOutDirIncludes = "$macOutDir/include/Sentry" + $macCocoaDir = "$outDir/Mac/Cocoa" + $macOutDirBinaries = "$macCocoaDir/bin" + $macOutDirIncludes = "$macCocoaDir/include/Sentry" - if (Test-Path $macOutDir) + if (Test-Path $macCocoaDir) { - Remove-Item $macOutDir -Recurse -Force + Remove-Item $macCocoaDir -Recurse -Force } - New-Item $macOutDir -ItemType Directory > $null + New-Item $macCocoaDir -ItemType Directory > $null New-Item $macOutDirBinaries -ItemType Directory > $null New-Item $macOutDirIncludes -ItemType Directory > $null @@ -341,6 +342,46 @@ function buildSentryNative() Copy-Item "$NativePath/install_native/include/sentry.h" -Destination "$nativeDir/include" } +function buildSentryNativeMac() +{ + if (-not (Test-Path $NativePath)) + { + throw "Sentry Native path does not exist: $NativePath" + } + + Write-Host "Building Sentry Native for macOS using local repository at: $NativePath" + + $platformDir = "$outDir/Mac" + + # Build Native backend (universal binary: x86_64 + arm64) + Write-Host "Building Native backend..." + Push-Location -Path $NativePath + try + { + cmake -B "build_native" -D SENTRY_BACKEND=native -D SENTRY_SDK_NAME=sentry.native.unreal -D SENTRY_BUILD_SHARED_LIBS=OFF ` + -D CMAKE_BUILD_TYPE=RelWithDebInfo -D "CMAKE_OSX_ARCHITECTURES=x86_64;arm64" -D CMAKE_OSX_DEPLOYMENT_TARGET=13.0 + cmake --build "build_native" --target sentry --parallel + cmake --build "build_native" --target sentry-crash --parallel + cmake --install "build_native" --prefix "install_native" + } + finally + { + Pop-Location + } + + $nativeDir = "$platformDir/Native" + if (Test-Path $nativeDir) { Remove-Item $nativeDir -Recurse -Force } + New-Item "$nativeDir/lib" -ItemType Directory -Force > $null + New-Item "$nativeDir/bin" -ItemType Directory -Force > $null + New-Item "$nativeDir/include" -ItemType Directory -Force > $null + + Get-ChildItem -Path "$NativePath/install_native/lib" -Filter "*.a" -Recurse | Copy-Item -Destination "$nativeDir/lib" + Copy-Item "$NativePath/build_native/sentry-crash" -Destination "$nativeDir/bin" + Copy-Item "$NativePath/install_native/include/sentry.h" -Destination "$nativeDir/include" + + Write-Host "Successfully built Sentry Native for macOS" +} + function buildSentryCrashReporter() { if (-not (Test-Path $CrashReporterPath)) @@ -431,7 +472,18 @@ if ($buildNative) } else { - buildSentryNative + if ($isWindowsPlatform) + { + buildSentryNative + } + elseif ($IsMacOS) + { + buildSentryNativeMac + } + else + { + Write-Warning "Native SDK build is not supported on this platform from build-deps.ps1. Use the platform-specific build script instead." + } } } diff --git a/scripts/build-mac-native.sh b/scripts/build-mac-native.sh new file mode 100755 index 000000000..9617c0c4d --- /dev/null +++ b/scripts/build-mac-native.sh @@ -0,0 +1,22 @@ +#!/bin/bash +set -euo pipefail + +export sentryNativeRoot=$1 +export sentryArtifactsDestination=$2 + +rm -rf "${sentryArtifactsDestination}/"* + +# Build sentry-native with native backend for macOS (universal binary: x86_64 + arm64) +cmake -S "${sentryNativeRoot}" -B "${sentryNativeRoot}/build_native" -D SENTRY_BACKEND=native -D SENTRY_SDK_NAME=sentry.native.unreal -D SENTRY_BUILD_SHARED_LIBS=OFF \ + -D CMAKE_BUILD_TYPE=RelWithDebInfo -D CMAKE_OSX_ARCHITECTURES="x86_64;arm64" -D CMAKE_OSX_DEPLOYMENT_TARGET=13.0 +cmake --build "${sentryNativeRoot}/build_native" --target sentry --parallel +cmake --build "${sentryNativeRoot}/build_native" --target sentry-crash --parallel +cmake --install "${sentryNativeRoot}/build_native" --prefix "${sentryNativeRoot}/install_native" + +mkdir "${sentryArtifactsDestination}/bin" +mkdir "${sentryArtifactsDestination}/include" +mkdir "${sentryArtifactsDestination}/lib" + +cp -r "${sentryNativeRoot}/install_native/lib/"*.a "${sentryArtifactsDestination}/lib" +cp "${sentryNativeRoot}/build_native/sentry-crash" "${sentryArtifactsDestination}/bin/sentry-crash" +cp "${sentryNativeRoot}/install_native/include/sentry.h" "${sentryArtifactsDestination}/include/sentry.h" diff --git a/scripts/download-cocoa.sh b/scripts/download-cocoa.sh index 7820c3f71..88985e671 100755 --- a/scripts/download-cocoa.sh +++ b/scripts/download-cocoa.sh @@ -40,16 +40,16 @@ rm -rf "Sentry.embeddedframework" rm "Sentry.embeddedframework.zip" # Prepare Mac artifacts -if ! [ -d "$(dirname $sentryArtifactsDestination)/Mac" ]; then - mkdir "$(dirname $sentryArtifactsDestination)/Mac" +if ! [ -d "$(dirname $sentryArtifactsDestination)/Mac/Cocoa" ]; then + mkdir -p "$(dirname $sentryArtifactsDestination)/Mac/Cocoa" else - rm -rf "$(dirname $sentryArtifactsDestination)/Mac/"* + rm -rf "$(dirname $sentryArtifactsDestination)/Mac/Cocoa/"* fi -mkdir "$(dirname $sentryArtifactsDestination)/Mac/bin" -mkdir "$(dirname $sentryArtifactsDestination)/Mac/include" +mkdir "$(dirname $sentryArtifactsDestination)/Mac/Cocoa/bin" +mkdir "$(dirname $sentryArtifactsDestination)/Mac/Cocoa/include" -cp "${sentryCocoaCache}/Sentry-Dynamic.xcframework/macos-arm64_x86_64/Sentry.framework/Sentry" "$(dirname $sentryArtifactsDestination)/Mac/bin/sentry.dylib" +cp "${sentryCocoaCache}/Sentry-Dynamic.xcframework/macos-arm64_x86_64/Sentry.framework/Sentry" "$(dirname $sentryArtifactsDestination)/Mac/Cocoa/bin/sentry.dylib" -cp -rL "${sentryCocoaCache}/Sentry-Dynamic.xcframework/macos-arm64_x86_64/Sentry.framework/Headers" "$(dirname $sentryArtifactsDestination)/Mac/include/Sentry" -cp -rL "${sentryCocoaCache}/Sentry-Dynamic.xcframework/macos-arm64_x86_64/Sentry.framework/PrivateHeaders/." "$(dirname $sentryArtifactsDestination)/Mac/include/Sentry" \ No newline at end of file +cp -rL "${sentryCocoaCache}/Sentry-Dynamic.xcframework/macos-arm64_x86_64/Sentry.framework/Headers" "$(dirname $sentryArtifactsDestination)/Mac/Cocoa/include/Sentry" +cp -rL "${sentryCocoaCache}/Sentry-Dynamic.xcframework/macos-arm64_x86_64/Sentry.framework/PrivateHeaders/." "$(dirname $sentryArtifactsDestination)/Mac/Cocoa/include/Sentry" \ No newline at end of file diff --git a/scripts/download-sdks.ps1 b/scripts/download-sdks.ps1 index 4b2417ed2..b96b74f11 100644 --- a/scripts/download-sdks.ps1 +++ b/scripts/download-sdks.ps1 @@ -34,8 +34,8 @@ if (-not (Test-Path $outDir)) New-Item $outDir -ItemType Directory > $null } -# Non-native platforms: single artifact per platform -$otherSdks = @("Android", "IOS", "Mac") +# Mobile platforms: single artifact per platform +$otherSdks = @("Android", "IOS") foreach ($sdk in $otherSdks) { $sdkDir = "$outDir/$sdk" @@ -49,6 +49,21 @@ foreach ($sdk in $otherSdks) gh run download $runId -n "$sdk-sdk" -D $sdkDir } +# Mac: cocoa SDK goes into Mac/Cocoa, native SDK into Mac/Native +Write-Host "Downloading Mac Cocoa SDK to $outDir/Mac/Cocoa ..." +if (Test-Path "$outDir/Mac/Cocoa") +{ + Remove-Item "$outDir/Mac/Cocoa" -Recurse +} +gh run download $runId -n "Mac-cocoa-sdk" -D "$outDir/Mac" + +Write-Host "Downloading Mac Native SDK to $outDir/Mac/Native ..." +if (Test-Path "$outDir/Mac/Native") +{ + Remove-Item "$outDir/Mac/Native" -Recurse +} +gh run download $runId -n "Mac-native-sdk" -D "$outDir/Mac/Native" + # Native platforms: two backend variants per platform $nativePlatforms = @("Linux", "LinuxArm64", "Win64", "WinArm64") foreach ($platform in $nativePlatforms) @@ -73,3 +88,4 @@ gh run download $runId -n "CrashReporter-Win64" -D "$outDir/Win64" gh run download $runId -n "CrashReporter-WinArm64" -D "$outDir/WinArm64" gh run download $runId -n "CrashReporter-Linux" -D "$outDir/Linux" gh run download $runId -n "CrashReporter-LinuxArm64" -D "$outDir/LinuxArm64" +gh run download $runId -n "CrashReporter-Mac" -D "$outDir/Mac" diff --git a/scripts/download-sdks.sh b/scripts/download-sdks.sh index eedb2aea0..1147627d2 100755 --- a/scripts/download-sdks.sh +++ b/scripts/download-sdks.sh @@ -23,14 +23,23 @@ if [[ "$runId" == "" ]]; then exit 1 fi -# Non-native platforms: single artifact per platform -declare -a otherSdks=("Android" "IOS" "Mac") +# Mobile platforms: single artifact per platform +declare -a otherSdks=("Android" "IOS") for sdk in "${otherSdks[@]}"; do echo "Downloading $sdk SDK to $PWD/$sdk ..." rm -rf "./$sdk" gh run download $runId -n "$sdk-sdk" -D $sdk done +# Mac: cocoa SDK goes into Mac/Cocoa, native SDK into Mac/Native +echo "Downloading Mac Cocoa SDK to $PWD/Mac/Cocoa ..." +rm -rf "./Mac/Cocoa" +gh run download $runId -n "Mac-cocoa-sdk" -D Mac + +echo "Downloading Mac Native SDK to $PWD/Mac/Native ..." +rm -rf "./Mac/Native" +gh run download $runId -n "Mac-native-sdk" -D Mac/Native + # Native platforms: two backend variants per platform declare -a nativePlatforms=("Linux" "LinuxArm64" "Win64" "WinArm64") for platform in "${nativePlatforms[@]}"; do @@ -43,16 +52,19 @@ for platform in "${nativePlatforms[@]}"; do done done -# Set permissions for Linux executables +# Set permissions for Linux/Mac executables for platform in Linux LinuxArm64; do chmod +x "$platform/Crashpad/bin/crashpad_handler" chmod +x "$platform/Native/bin/sentry-crash" done +chmod +x Mac/Native/bin/sentry-crash echo "Downloading Crash Reporter binaries ..." gh run download $runId -n "CrashReporter-Win64" -D Win64 gh run download $runId -n "CrashReporter-WinArm64" -D WinArm64 gh run download $runId -n "CrashReporter-Linux" -D Linux gh run download $runId -n "CrashReporter-LinuxArm64" -D LinuxArm64 +gh run download $runId -n "CrashReporter-Mac" -D Mac chmod +x Linux/Sentry.CrashReporter chmod +x LinuxArm64/Sentry.CrashReporter +chmod +x Mac/Sentry.CrashReporter diff --git a/scripts/packaging/package.snapshot b/scripts/packaging/package.snapshot index f5d0d43c6..c8b02cb43 100644 --- a/scripts/packaging/package.snapshot +++ b/scripts/packaging/package.snapshot @@ -398,66 +398,70 @@ Source/ThirdParty/LinuxArm64/Native/include/sentry.h Source/ThirdParty/LinuxArm64/Native/lib/libsentry.a Source/ThirdParty/LinuxArm64/Native/lib/libunwind.a Source/ThirdParty/LinuxArm64/Sentry.CrashReporter -Source/ThirdParty/Mac/bin/sentry.dylib -Source/ThirdParty/Mac/include/Sentry/PrivateSentrySDKOnly.h -Source/ThirdParty/Mac/include/Sentry/PrivatesHeader.h -Source/ThirdParty/Mac/include/Sentry/Sentry-Swift.h -Source/ThirdParty/Mac/include/Sentry/Sentry.h -Source/ThirdParty/Mac/include/Sentry/SentryAppStartMeasurement.h -Source/ThirdParty/Mac/include/Sentry/SentryAsynchronousOperation.h -Source/ThirdParty/Mac/include/Sentry/SentryAttachment.h -Source/ThirdParty/Mac/include/Sentry/SentryBaggage.h -Source/ThirdParty/Mac/include/Sentry/SentryBreadcrumb.h -Source/ThirdParty/Mac/include/Sentry/SentryBreadcrumb+Private.h -Source/ThirdParty/Mac/include/Sentry/SentryCrashExceptionApplication.h -Source/ThirdParty/Mac/include/Sentry/SentryCrashReportConverter.h -Source/ThirdParty/Mac/include/Sentry/SentryCrashReportSink.h -Source/ThirdParty/Mac/include/Sentry/SentryDateUtils.h -Source/ThirdParty/Mac/include/Sentry/SentryDebugMeta.h -Source/ThirdParty/Mac/include/Sentry/SentryDefines.h -Source/ThirdParty/Mac/include/Sentry/SentryError.h -Source/ThirdParty/Mac/include/Sentry/SentryEvent.h -Source/ThirdParty/Mac/include/Sentry/SentryException.h -Source/ThirdParty/Mac/include/Sentry/SentryFormatter.h -Source/ThirdParty/Mac/include/Sentry/SentryFrame.h -Source/ThirdParty/Mac/include/Sentry/SentryGeo.h -Source/ThirdParty/Mac/include/Sentry/SentryHttpStatusCodeRange.h -Source/ThirdParty/Mac/include/Sentry/SentryId.h -Source/ThirdParty/Mac/include/Sentry/SentryInternalSerializable.h -Source/ThirdParty/Mac/include/Sentry/SentryLevel.h -Source/ThirdParty/Mac/include/Sentry/SentryLogC.h -Source/ThirdParty/Mac/include/Sentry/SentryMeasurementUnit.h -Source/ThirdParty/Mac/include/Sentry/SentryMechanism.h -Source/ThirdParty/Mac/include/Sentry/SentryMechanismContext.h -Source/ThirdParty/Mac/include/Sentry/SentryMessage.h -Source/ThirdParty/Mac/include/Sentry/SentryNSDataUtils.h -Source/ThirdParty/Mac/include/Sentry/SentryNSDictionarySanitize.h -Source/ThirdParty/Mac/include/Sentry/SentryNSError.h -Source/ThirdParty/Mac/include/Sentry/SentryOptionsInternal.h -Source/ThirdParty/Mac/include/Sentry/SentryProfilingConditionals.h -Source/ThirdParty/Mac/include/Sentry/SentryReplayApi.h -Source/ThirdParty/Mac/include/Sentry/SentryRequest.h -Source/ThirdParty/Mac/include/Sentry/SentryRequestOperation.h -Source/ThirdParty/Mac/include/Sentry/SentrySampleDecision.h -Source/ThirdParty/Mac/include/Sentry/SentrySamplingContext.h -Source/ThirdParty/Mac/include/Sentry/SentryScope.h -Source/ThirdParty/Mac/include/Sentry/SentrySDK+Private.h -Source/ThirdParty/Mac/include/Sentry/SentrySerializable.h -Source/ThirdParty/Mac/include/Sentry/SentrySessionReplayHybridSDK.h -Source/ThirdParty/Mac/include/Sentry/SentrySpanContext.h -Source/ThirdParty/Mac/include/Sentry/SentrySpanId.h -Source/ThirdParty/Mac/include/Sentry/SentrySpanProtocol.h -Source/ThirdParty/Mac/include/Sentry/SentrySpanStatus.h -Source/ThirdParty/Mac/include/Sentry/SentryStacktrace.h -Source/ThirdParty/Mac/include/Sentry/SentrySwift.h -Source/ThirdParty/Mac/include/Sentry/SentrySwizzle.h -Source/ThirdParty/Mac/include/Sentry/SentryThread.h -Source/ThirdParty/Mac/include/Sentry/SentryTraceContext.h -Source/ThirdParty/Mac/include/Sentry/SentryTraceHeader.h -Source/ThirdParty/Mac/include/Sentry/SentryTransactionContext.h -Source/ThirdParty/Mac/include/Sentry/SentryUser.h -Source/ThirdParty/Mac/include/Sentry/SentryUser+Private.h -Source/ThirdParty/Mac/include/Sentry/SentryWithoutUIKit.h +Source/ThirdParty/Mac/Cocoa/bin/sentry.dylib +Source/ThirdParty/Mac/Cocoa/include/Sentry/PrivateSentrySDKOnly.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/PrivatesHeader.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/Sentry-Swift.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/Sentry.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryAppStartMeasurement.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryAsynchronousOperation.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryAttachment.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryBaggage.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryBreadcrumb.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryBreadcrumb+Private.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryCrashExceptionApplication.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryCrashReportConverter.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryCrashReportSink.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryDateUtils.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryDebugMeta.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryDefines.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryError.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryEvent.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryException.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryFormatter.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryFrame.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryGeo.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryHttpStatusCodeRange.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryId.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryInternalSerializable.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryLevel.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryLogC.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryMeasurementUnit.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryMechanism.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryMechanismContext.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryMessage.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryNSDataUtils.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryNSDictionarySanitize.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryNSError.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryOptionsInternal.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryProfilingConditionals.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryReplayApi.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryRequest.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryRequestOperation.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentrySampleDecision.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentrySamplingContext.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryScope.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentrySDK+Private.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentrySerializable.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentrySessionReplayHybridSDK.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentrySpanContext.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentrySpanId.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentrySpanProtocol.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentrySpanStatus.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryStacktrace.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentrySwift.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentrySwizzle.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryThread.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryTraceContext.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryTraceHeader.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryTransactionContext.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryUser.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryUser+Private.h +Source/ThirdParty/Mac/Cocoa/include/Sentry/SentryWithoutUIKit.h +Source/ThirdParty/Mac/Native/bin/sentry-crash +Source/ThirdParty/Mac/Native/include/sentry.h +Source/ThirdParty/Mac/Native/lib/libsentry.a +Source/ThirdParty/Mac/Sentry.CrashReporter Source/ThirdParty/Win64/Crashpad/bin/crashpad_handler.exe Source/ThirdParty/Win64/Crashpad/bin/crashpad_wer.dll Source/ThirdParty/Win64/Crashpad/include/sentry.h