Skip to content
Open
9 changes: 2 additions & 7 deletions integration-test/android.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -177,13 +177,8 @@ Describe 'MAUI app (<dotnet_version>, <configuration>)' -ForEach $cases -Skip:(-
Dump-ServerErrors -Result $result
$result.HasErrors() | Should -BeFalse
$result.Events() | Should -AnyElementMatch "`"type`":`"System.NullReferenceException`""
# TODO: fix redundant SIGSEGV in Release (#3954)
if ($configuration -eq "Release") {
{ $result.Events() | Should -Not -AnyElementMatch "`"type`":`"SIGSEGV`"" } | Should -Throw
} else {
$result.Events() | Should -Not -AnyElementMatch "`"type`":`"SIGSEGV`""
$result.Events() | Should -HaveCount 1
}
$result.Events() | Should -Not -AnyElementMatch "`"type`":`"SIGSEGV`""
$result.Events() | Should -HaveCount 1
}

It 'Delivers battery breadcrumbs in main thread (<configuration>)' {
Expand Down
1 change: 1 addition & 0 deletions integration-test/net9-maui/MauiProgram.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public static MauiApp CreateMauiApp()
{
#if ANDROID
options.Dsn = "{{SENTRY_DSN}}";
options.Native.SignalHandlerStrategy = Sentry.Android.SignalHandlerStrategy.ChainAtStart;
#endif
options.Debug = false;
options.DiagnosticLevel = SentryLevel.Error;
Expand Down
4 changes: 4 additions & 0 deletions src/Sentry/Platforms/Android/BindableNativeSentryOptions.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using Sentry.Android;

// ReSharper disable once CheckNamespace
namespace Sentry;

Expand All @@ -24,6 +26,7 @@ public class NativeOptions
public bool? EnableAutoActivityLifecycleTracing { get; set; }
public bool? EnableActivityLifecycleTracingAutoFinish { get; set; }
public bool? EnableUserInteractionTracing { get; set; }
public SignalHandlerStrategy? SignalHandlerStrategy { get; set; }
public bool? AttachThreads { get; set; }
public TimeSpan? ConnectionTimeout { get; set; }
public bool? EnableNdk { get; set; }
Expand Down Expand Up @@ -66,6 +69,7 @@ public void ApplyTo(SentryOptions.NativeOptions options)
options.EnableAutoActivityLifecycleTracing = EnableAutoActivityLifecycleTracing ?? options.EnableAutoActivityLifecycleTracing;
options.EnableActivityLifecycleTracingAutoFinish = EnableActivityLifecycleTracingAutoFinish ?? options.EnableActivityLifecycleTracingAutoFinish;
options.EnableUserInteractionTracing = EnableUserInteractionTracing ?? options.EnableUserInteractionTracing;
options.SignalHandlerStrategy = SignalHandlerStrategy ?? options.SignalHandlerStrategy;
options.AttachThreads = AttachThreads ?? options.AttachThreads;
options.ConnectionTimeout = ConnectionTimeout ?? options.ConnectionTimeout;
options.EnableNdk = EnableNdk ?? options.EnableNdk;
Expand Down
15 changes: 15 additions & 0 deletions src/Sentry/Platforms/Android/NativeOptions.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using Sentry.Android;

// ReSharper disable once CheckNamespace
namespace Sentry;

Expand Down Expand Up @@ -152,6 +154,19 @@ internal NativeOptions(SentryOptions options)
/// </remarks>
public bool EnableUserInteractionTracing { get; set; } = false;

/// <summary>
/// Gets or sets the strategy for how Sentry Native's signal handler interacts with the CLR/Mono
/// signal handler.
/// The default value is <c>SignalHandlerStrategy.Default</c> (enabled).
/// </summary>
/// <remarks>
/// When set to <see cref="Android.SignalHandlerStrategy.ChainAtStart"/>, .NET runtimes
/// 10.0.100–10.0.301 shipped in .NET SDKs 10.0.0–10.0.3 will crash. The issue was fixed in
/// <see href="https://github.com/dotnet/runtime/pull/123346">dotnet/runtime#123346</see>,
/// which shipped as .NET runtime 10.0.400 in .NET SDK 10.0.4.
/// </remarks>
public SignalHandlerStrategy SignalHandlerStrategy { get; set; } = SignalHandlerStrategy.Default;

// ---------- From SentryOptions.java ----------

/// <summary>
Expand Down
6 changes: 5 additions & 1 deletion src/Sentry/Platforms/Android/SentrySdk.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,11 @@ private static void InitSentryAndroidSdk(SentryOptions options)
o.ServerName = options.ServerName;
o.SessionTrackingIntervalMillis = (long)options.AutoSessionTrackingInterval.TotalMilliseconds;
o.ShutdownTimeoutMillis = (long)options.ShutdownTimeout.TotalMilliseconds;
o.SetNativeHandlerStrategy(JavaSdk.Android.Core.NdkHandlerStrategy.SentryHandlerStrategyDefault);
o.SetNativeHandlerStrategy(options.Native.SignalHandlerStrategy switch
{
SignalHandlerStrategy.ChainAtStart => NdkHandlerStrategy.SentryHandlerStrategyChainAtStart,
_ => NdkHandlerStrategy.SentryHandlerStrategyDefault
});

if (options.CacheDirectoryPath is { } cacheDirectoryPath)
{
Expand Down
25 changes: 25 additions & 0 deletions src/Sentry/Platforms/Android/SignalHandlerStrategy.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
namespace Sentry.Android;

/// <summary>
/// Defines how Sentry Native's signal handler interacts with the CLR/Mono
/// signal handler.
/// </summary>
public enum SignalHandlerStrategy
{
/// <summary>
/// Invokes the CLR/Mono signal handler at the end of Sentry Native's signal
/// handler.
/// </summary>
Default,
/// <summary>
/// Invokes the CLR/Mono signal handler at the start of Sentry Native's
/// signal handler.
/// </summary>
/// <remarks>
/// .NET runtimes 10.0.100–10.0.301 shipped in .NET SDKs 10.0.0–10.0.3 crash when used
/// with this option. The issue was fixed in
/// <see href="https://github.com/dotnet/runtime/pull/123346">dotnet/runtime#123346</see>,
/// which shipped as .NET runtime 10.0.400 in .NET SDK 10.0.4.
/// </remarks>
ChainAtStart
}
Loading