Skip to content
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

Android AOT+LLVM InvalidOperation_EnumEnded #73304

Closed
jonathanpeppers opened this issue Aug 3, 2022 · 3 comments
Closed

Android AOT+LLVM InvalidOperation_EnumEnded #73304

jonathanpeppers opened this issue Aug 3, 2022 · 3 comments

Comments

@jonathanpeppers
Copy link
Member

Description

In a PR where we have $(EnableLLVM) working on Android in .NET 7: dotnet/android#7188

Some of our 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 )

I think it's just the result of foreach over an array twice?

Reproduction Steps

Build my branch on dotnet/android#7188 in Release mode, I will try to merge it with tests disabled to make this easier.

Then run the test:

./dotnet-local.sh build tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj -t:Install,RunTestApks -c Release

I can also share the .apk file if that helps.

Expected behavior

We shouldn't get InvalidOperation_EnumEnded.

Actual behavior

We get InvalidOperation_EnumEnded.

Regression?

These tests are working in .NET 6.

Known Workarounds

Don't use -p:EnableLLVM=true.

Configuration

.NET 7.0.100-rc.1.22374.1 SDK

Other information

No response

@ghost ghost added the untriaged New issue has not been triaged by the area owner label Aug 3, 2022
jonathanpeppers added a commit to dotnet/android that referenced this issue Aug 3, 2022
`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.
jonathanpeppers added a commit to dotnet/android that referenced this issue Aug 5, 2022
`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.
@SamMonoRT
Copy link
Member

related to #68914 --- cc @vargaz

@vargaz
Copy link
Contributor

vargaz commented Sep 6, 2022

Does this still happen with the latest 7.0 rc ?

jonathanpeppers pushed a commit to dotnet/android that referenced this issue Sep 8, 2022
It appears that an Android NDK installation is no longer needed when
using Aot with LLVM.  Projects which enable Aot and LLVM will no longer
attempt to use the NDK unless it is explicitly requested by setting
`$(AndroidNdkDirectory)` to a valid NDK path in the project file.

This also enables tests for LLVM with a few categories turned off for now:

* `InetAccess`: dotnet/runtime#73304
* `NetworkInterfaces`: dotnet/runtime#75155
@jonathanpeppers
Copy link
Member Author

This one appears to be fixed in .NET 7 RC 2, we were able to enable these tests again here:

dotnet/android#6901

jonathanpeppers added a commit to jonathanpeppers/xamarin-android that referenced this issue Sep 15, 2022
Context: dotnet/runtime#73304
Context: dotnet/runtime#75155

The issues for these should be fixed in .NET 7 RC 2.
jonathanpeppers added a commit to jonathanpeppers/xamarin-android that referenced this issue Sep 28, 2022
Context: dotnet/runtime#73304
Context: dotnet/runtime#75155

The issues for these should be fixed in .NET 7 RC 2.
jonathanpeppers added a commit to dotnet/android that referenced this issue Sep 30, 2022
Context: dotnet/runtime#73304
Context: dotnet/runtime#75155

The issues for these should be fixed in .NET 7 RC 2.
jonathanpeppers added a commit to dotnet/android that referenced this issue Sep 30, 2022
Context: dotnet/runtime#73304
Context: dotnet/runtime#75155

The issues for these should be fixed in .NET 7 RC 2.
@ghost ghost locked as resolved and limited conversation to collaborators Oct 10, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

3 participants