-
Notifications
You must be signed in to change notification settings - Fork 4.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
.NET 7 exception on Android with EnableLLVM=true #73003
Comments
I couldn't figure out the best area label to add to this issue. If you have write-permissions please help me learn by adding exactly one area label. |
We also tried passing But that might be solved by: #72982 |
Tagging subscribers to 'arch-android': @steveisok, @akoeplinger Issue DetailsDescriptionRun with LLVM on an arm64 device, and you can run into:
Somewhere here:
So I think /cc @fanyang-mono Reproduction Steps
Expected behaviorYou can use Profiled AOT + LLVM together on Android. Actual behaviorWe get an exception when trying to use Profiled AOT + LLVM together on Android. Regression?I don't hit this same exception in .NET 6, but maybe it's just luck? Known WorkaroundsYou can turn off profiled AOT, such as Configuration.NET 7.0.100-rc.1.22374.1 Other informationNo response
|
Hopefully. |
@jonathanpeppers Any chance you can help us validate? |
I triggered Maestro just now, but I don't see the change there yet: dotnet/android#7217 Maybe we can try it tomorrow. |
This could be a dup of #60792 |
`dotnet new android` apps would crash on startup when built with `-c Release -p:EnableLLVM=true`: 07-20 08:55:44.642 2983 2983 F monodroid-assembly: Internal p/invoke symbol 'java-interop @ java_interop_jvm_list' (hash: 0x58c48fc8b89cb484) not found in compile-time map. ... 07-20 08:55:44.834 3004 3004 F DEBUG : signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr -------- 07-20 08:55:44.834 3004 3004 F DEBUG : Abort message: 'Internal p/invoke symbol 'java-interop @ java_interop_jvm_list' (hash: 0x58c48fc8b89cb484) not found in compile-time map.' `java_interop_jvm_list` should *never* be called on Android, it is the result of `new AndroidRuntime()` having not been called yet? The problem being that the static `Android.App.Application.cctor` was somehow running *before* `JNIEnv.Initialize()` was complete? And this only happens with LLVM? Reviewing the code: [UnmanagedCallersOnly] internal static unsafe void Initialize (JnienvInitializeArgs* args) { //... SynchronizationContext.SetSynchronizationContext (Android.App.Application.SynchronizationContext); } We do indeed access `Android.App.Application`... To fix this, we can move this to a new method decorated with `MethodImplOptions.NoInlining`. Apps built with LLVM now launch for me. However, we can't really enable the LLVM `Mono.Android-Tests` quite yet. Read on! ~~ Known Issues ~~ * dotnet/runtime#73003 Using Profiled AOT and LLVM at the same time can hit: [ERROR] FATAL UNHANDLED EXCEPTION: System.PlatformNotSupportedException: Arg_PlatformNotSupported at System.Text.ASCIIUtility.GetIndexOfFirstNonAsciiByte_Intrinsified(Byte* , UIntPtr ) at System.Text.Unicode.Utf8Utility.GetPointerToFirstInvalidByte(Byte* , Int32 , Int32& , Int32& ) at System.Text.UTF8Encoding.GetCharCount(Byte* , Int32 ) at System.String.CreateStringFromEncoding(Byte* , Int32 , Encoding ) at System.Text.Encoding.GetString(Byte* , Int32 ) at System.String.CreateStringForSByteConstructor(Byte* , Int32 ) at System.String.Ctor(SByte* value) at Java.Interop.TypeManager.GetClassName(IntPtr ) at Android.Runtime.JNIEnv.RegisterJniNatives(IntPtr , Int32 , IntPtr , IntPtr , Int32 ) For now we can set `AndroidEnableProfiledAot=false` for the LLVM tests. * dotnet/runtime#73304 Some Java.Interop unit tests fail with: System.InvalidOperationException : InvalidOperation_EnumEnded at System.ArrayEnumerator.get_Current() at Cadenza.Collections.Tests.CollectionContract`1[[System.Int16, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].DisposeCollection(IEnumerable c) at Cadenza.Collections.Tests.CollectionContract`1[[System.Int16, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].CopyTo() at System.Reflection.MethodInvoker.InterpretedInvoke(Object , Span`1 , BindingFlags ) * https://github.com/xamarin/java.interop/blob/a3de91efdaec04b3927b755a07018e8d26cfdc71/tests/Java.Interop-Tests/Cadenza.Collections/CollectionContract.cs#L205-L221 * https://github.com/xamarin/java.interop/blob/a3de91efdaec04b3927b755a07018e8d26cfdc71/tests/Java.Interop-Tests/Cadenza.Collections/CollectionContract.cs#L85-L86 The `InetAccess` category causes the `Mono.Android-Tests` suite to crash with: 08-02 21:26:57.581 5154 5173 I NUnit : System.NetTests.ProxyTest : 646.269 ms 08-02 21:26:57.593 5154 5173 I droid.NET_Test: Explicit concurrent copying GC freed 20(95KB) AllocSpace objects, 0(0B) LOS objects, 59% free, 1054KB/2590KB, paused 1.469ms total 7.180ms 08-02 21:26:57.594 5154 5173 I NUnit : SslTest 08-02 21:26:57.594 5154 5173 I NUnit : HttpsShouldWork 08-02 21:26:57.858 5154 5181 D NetworkSecurityConfig: No Network Security Config specified, using platform default 08-02 21:26:58.585 5154 5164 I droid.NET_Test: Background young concurrent copying GC freed 39658(2920KB) AllocSpace objects, 0(0B) LOS objects, 22% free, 1999KB/2590KB, paused 69.607ms total 194.902ms 08-02 21:26:58.922 5154 5164 I droid.NET_Test: Background concurrent copying GC freed 12412(836KB) AllocSpace objects, 0(0B) LOS objects, 46% free, 6987KB/12MB, paused 2.127ms total 327.448ms 08-02 21:26:58.953 5154 5181 I monodroid-timing: [1/0] LZ4 decompression time for <assembly_store>; elapsed: 0:0::75000 08-02 21:26:58.954 5154 5181 W linker : Warning: "/data/app/Mono.Android.NET_Tests-QcXozuJGB3EpfK6bvDvvMQ==/split_config.x86_64.apk!/lib/x86_64/libaot-System.Formats.Asn1.dll.so" has no DT_SONAME (will use libaot-System.Formats.Asn1.dll.so instead) and will not work when the app moves to API level 23 or later (https://android.googlesource.com/platform/bionic/+/master/missing-soname-enforced-for-api-level-23) (allowing for now because this app's target API level is still 21) 08-02 21:26:59.037 5154 5181 I monodroid-timing: [1/0] LZ4 decompression time for <assembly_store>; elapsed: 0:0::129000 08-02 21:26:59.038 5154 5181 W linker : Warning: "/data/app/Mono.Android.NET_Tests-QcXozuJGB3EpfK6bvDvvMQ==/split_config.x86_64.apk!/lib/x86_64/libaot-System.Runtime.Numerics.dll.so" has no DT_SONAME (will use libaot-System.Runtime.Numerics.dll.so instead) and will not work when the app moves to API level 23 or later (https://android.googlesource.com/platform/bionic/+/master/missing-soname-enforced-for-api-level-23) (allowing for now because this app's target API level is still 21) 08-02 21:26:56.680 5154 5154 W Instrumentation: type=1400 audit(0.0:432): avc: denied { search } for name="run" dev="vdc" ino=32774 scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:varrun_file:s0 tclass=dir permissive=0 app=Mono.Android.NET_Tests 08-02 21:26:56.770 5154 5154 W Instrumentation: type=1400 audit(0.0:433): avc: denied { ioctl } for path="socket:[49468]" dev="sockfs" ino=49468 ioctlcmd=0x8946 scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:r:untrusted_app_25:s0:c512,c768 tclass=udp_socket permissive=0 app=Mono.Android.NET_Tests 08-02 21:26:56.780 5154 5154 W Instrumentation: type=1400 audit(0.0:434): avc: denied { ioctl } for path="socket:[49468]" dev="sockfs" ino=49468 ioctlcmd=0x8946 scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:r:untrusted_app_25:s0:c512,c768 tclass=udp_socket permissive=0 app=Mono.Android.NET_Tests 08-02 21:27:00.029 1540 1540 I Zygote : Process 5154 exited due to signal 11 (Segmentation fault) Not really any useful info here... Disabled this category for now. We can file an issue for this one, assuming it is different than the other issues.
`dotnet new android` apps would crash on startup when built with `-c Release -p:EnableLLVM=true`: 07-20 08:55:44.642 2983 2983 F monodroid-assembly: Internal p/invoke symbol 'java-interop @ java_interop_jvm_list' (hash: 0x58c48fc8b89cb484) not found in compile-time map. ... 07-20 08:55:44.834 3004 3004 F DEBUG : signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr -------- 07-20 08:55:44.834 3004 3004 F DEBUG : Abort message: 'Internal p/invoke symbol 'java-interop @ java_interop_jvm_list' (hash: 0x58c48fc8b89cb484) not found in compile-time map.' `java_interop_jvm_list` should *never* be called on Android, it is the result of `new AndroidRuntime()` having not been called yet? The problem being that the static `Android.App.Application.cctor` was somehow running *before* `JNIEnv.Initialize()` was complete? And this only happens with LLVM? Reviewing the code: [UnmanagedCallersOnly] internal static unsafe void Initialize (JnienvInitializeArgs* args) { //... SynchronizationContext.SetSynchronizationContext (Android.App.Application.SynchronizationContext); } We do indeed access `Android.App.Application`... To fix this, we can move this to a new method decorated with `MethodImplOptions.NoInlining`. Apps built with LLVM now launch for me. However, we can't really enable the LLVM `Mono.Android-Tests` quite yet. Read on! ~~ Known Issues ~~ * dotnet/runtime#73003 Using Profiled AOT and LLVM at the same time can hit: [ERROR] FATAL UNHANDLED EXCEPTION: System.PlatformNotSupportedException: Arg_PlatformNotSupported at System.Text.ASCIIUtility.GetIndexOfFirstNonAsciiByte_Intrinsified(Byte* , UIntPtr ) at System.Text.Unicode.Utf8Utility.GetPointerToFirstInvalidByte(Byte* , Int32 , Int32& , Int32& ) at System.Text.UTF8Encoding.GetCharCount(Byte* , Int32 ) at System.String.CreateStringFromEncoding(Byte* , Int32 , Encoding ) at System.Text.Encoding.GetString(Byte* , Int32 ) at System.String.CreateStringForSByteConstructor(Byte* , Int32 ) at System.String.Ctor(SByte* value) at Java.Interop.TypeManager.GetClassName(IntPtr ) at Android.Runtime.JNIEnv.RegisterJniNatives(IntPtr , Int32 , IntPtr , IntPtr , Int32 ) For now we can set `AndroidEnableProfiledAot=false` for the LLVM tests. * dotnet/runtime#73304 Some Java.Interop unit tests fail with: System.InvalidOperationException : InvalidOperation_EnumEnded at System.ArrayEnumerator.get_Current() at Cadenza.Collections.Tests.CollectionContract`1[[System.Int16, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].DisposeCollection(IEnumerable c) at Cadenza.Collections.Tests.CollectionContract`1[[System.Int16, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].CopyTo() at System.Reflection.MethodInvoker.InterpretedInvoke(Object , Span`1 , BindingFlags ) * https://github.com/xamarin/java.interop/blob/a3de91efdaec04b3927b755a07018e8d26cfdc71/tests/Java.Interop-Tests/Cadenza.Collections/CollectionContract.cs#L205-L221 * https://github.com/xamarin/java.interop/blob/a3de91efdaec04b3927b755a07018e8d26cfdc71/tests/Java.Interop-Tests/Cadenza.Collections/CollectionContract.cs#L85-L86 The `InetAccess` category causes the `Mono.Android-Tests` suite to crash with: 08-02 21:26:57.581 5154 5173 I NUnit : System.NetTests.ProxyTest : 646.269 ms 08-02 21:26:57.593 5154 5173 I droid.NET_Test: Explicit concurrent copying GC freed 20(95KB) AllocSpace objects, 0(0B) LOS objects, 59% free, 1054KB/2590KB, paused 1.469ms total 7.180ms 08-02 21:26:57.594 5154 5173 I NUnit : SslTest 08-02 21:26:57.594 5154 5173 I NUnit : HttpsShouldWork 08-02 21:26:57.858 5154 5181 D NetworkSecurityConfig: No Network Security Config specified, using platform default 08-02 21:26:58.585 5154 5164 I droid.NET_Test: Background young concurrent copying GC freed 39658(2920KB) AllocSpace objects, 0(0B) LOS objects, 22% free, 1999KB/2590KB, paused 69.607ms total 194.902ms 08-02 21:26:58.922 5154 5164 I droid.NET_Test: Background concurrent copying GC freed 12412(836KB) AllocSpace objects, 0(0B) LOS objects, 46% free, 6987KB/12MB, paused 2.127ms total 327.448ms 08-02 21:26:58.953 5154 5181 I monodroid-timing: [1/0] LZ4 decompression time for <assembly_store>; elapsed: 0:0::75000 08-02 21:26:58.954 5154 5181 W linker : Warning: "/data/app/Mono.Android.NET_Tests-QcXozuJGB3EpfK6bvDvvMQ==/split_config.x86_64.apk!/lib/x86_64/libaot-System.Formats.Asn1.dll.so" has no DT_SONAME (will use libaot-System.Formats.Asn1.dll.so instead) and will not work when the app moves to API level 23 or later (https://android.googlesource.com/platform/bionic/+/master/missing-soname-enforced-for-api-level-23) (allowing for now because this app's target API level is still 21) 08-02 21:26:59.037 5154 5181 I monodroid-timing: [1/0] LZ4 decompression time for <assembly_store>; elapsed: 0:0::129000 08-02 21:26:59.038 5154 5181 W linker : Warning: "/data/app/Mono.Android.NET_Tests-QcXozuJGB3EpfK6bvDvvMQ==/split_config.x86_64.apk!/lib/x86_64/libaot-System.Runtime.Numerics.dll.so" has no DT_SONAME (will use libaot-System.Runtime.Numerics.dll.so instead) and will not work when the app moves to API level 23 or later (https://android.googlesource.com/platform/bionic/+/master/missing-soname-enforced-for-api-level-23) (allowing for now because this app's target API level is still 21) 08-02 21:26:56.680 5154 5154 W Instrumentation: type=1400 audit(0.0:432): avc: denied { search } for name="run" dev="vdc" ino=32774 scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:varrun_file:s0 tclass=dir permissive=0 app=Mono.Android.NET_Tests 08-02 21:26:56.770 5154 5154 W Instrumentation: type=1400 audit(0.0:433): avc: denied { ioctl } for path="socket:[49468]" dev="sockfs" ino=49468 ioctlcmd=0x8946 scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:r:untrusted_app_25:s0:c512,c768 tclass=udp_socket permissive=0 app=Mono.Android.NET_Tests 08-02 21:26:56.780 5154 5154 W Instrumentation: type=1400 audit(0.0:434): avc: denied { ioctl } for path="socket:[49468]" dev="sockfs" ino=49468 ioctlcmd=0x8946 scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:r:untrusted_app_25:s0:c512,c768 tclass=udp_socket permissive=0 app=Mono.Android.NET_Tests 08-02 21:27:00.029 1540 1540 I Zygote : Process 5154 exited due to signal 11 (Segmentation fault) Not really any useful info here... Disabled this category for now. We can file an issue for this one, assuming it is different than the other issues.
this is a nasty problem. so the issue is.
I believe the fix is that when we check for "jit_supported" instead of just checking "are we using LLVM", we need to check "and we don't have the JIT as a fallback". in other words, we have to be in FullAOT or HybridAOT mode. runtime/src/mono/mono/mini/simd-intrinsics.c Lines 721 to 723 in 8027c80
In other words: profiled AOT cannot benefit from the arm64 intrinsics work we've done for LLVM. |
not a fix for the underlying issue but could we somehow force the intrinsics APIs to be included in the profile so that we still get the LLVM intrinsics handling by default? |
I'm not sure I understand the suggestion. The issue is: the code that decides if we should use an optimized version of an algorithm sees different The code that decides is compiled with LLVM AOT and therefore |
Basically the "fallback" execution engines need to return |
The reason why Android is seeing this is because Android uses this setup: LLVM AOT with non-LLVM JIT fallback. Currently, |
My suggestion was to make sure we always LLVM AOT the implementation, regardless of whether it is used by the profile, so that no fallback to the JIT occurs. |
That's hard for a number of reasons:
If we had some attribute |
Description
Run with LLVM on an arm64 device, and you can run into:
Somewhere here:
runtime/src/libraries/System.Private.CoreLib/src/System/Text/ASCIIUtility.cs
Line 88 in b31a48a
So I think
AdvSimd.Arm64.IsSupported
istrue
, but becauseGetIndexOfFirstNonAsciiByte_Intrinsified()
is not in the AOT profile (it's running under JIT), we get the above exception. It's possible that the above code should also work under JIT./cc @fanyang-mono
Reproduction Steps
dotnet new android
dotnet build -t:Run -c Release -p:EnableLLVM=true
to run on an arm64 device (in my case a Pixel 5)Expected behavior
You can use Profiled AOT + LLVM together on Android.
Actual behavior
We get an exception when trying to use Profiled AOT + LLVM together on Android.
Regression?
I don't hit this same exception in .NET 6, but maybe it's just luck?
Known Workarounds
You can turn off profiled AOT, such as
-p:AndroidEnableProfiledAot=false
or don't use LLVM.Configuration
.NET 7.0.100-rc.1.22374.1
Other information
No response
The text was updated successfully, but these errors were encountered: