-
Notifications
You must be signed in to change notification settings - Fork 537
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
[Mono.Android] fix crash on startup with EnableLLVM #7188
Conversation
A
|
Looking at the logcat output, and the output is "interesting". PID 4955 is the relevant process; only PID 4955 output:
What looks particularly "interesting" is:
I don't know where this message is coming from; I don't see it in xamarin-android or in dotnet/runtime. |
@jonathanpeppers: are you able to repro this crash locally? It would be good to get a crash with an un- |
Android must print this on the x86_64 emulator, seems like all processes? The symbolicated crash I'm getting is:
|
67bf7d8
to
534423d
Compare
`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. We can also enable the LLVM `Mono.Android-Tests` again.
534423d
to
0ee0f49
Compare
# TODO: disable LLVM test, see: https://github.com/dotnet/runtime/issues/68914 | ||
# TODO: disable LLVM test, see: | ||
# https://github.com/dotnet/runtime/issues/68914 | ||
# https://github.com/dotnet/runtime/issues/73304 | ||
condition: false |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I kept these disabled because of: dotnet/runtime#73304
I think we should merge this with the tests disabled, because it does get things further.
<ExcludeCategories Condition=" '$(RunAOTCompilation)' == 'true' ">$(ExcludeCategories):InetAccess</ExcludeCategories> | ||
<ExcludeCategories Condition=" '$(EnableLLVM)' == 'true' ">$(ExcludeCategories):InetAccess</ExcludeCategories> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since 0084162, this Condition
wasn't actually doing anything. We weren't passing in RunAOTCompilation=true
because that is the default value for Release
builds.
InetAccess
seems to crash the tests when EnableLLVM=true
, however... So let's keep the condition for that case.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you please also open an issue for the InetAccess
test crashes with LLVM enabled?
The designer tests should be getting fixed by: #7227 And going to ignore these, unrelated: Going to merge, with a decent commit message shortly. |
condition: false | ||
configuration: $(XA.Build.Configuration) | ||
testName: Mono.Android.NET_Tests-AotLlvm | ||
project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj | ||
testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)AotLlvm.xml | ||
extraBuildArgs: -p:TestsFlavor=AotLlvm -p:EnableLlvm=true | ||
extraBuildArgs: -p:TestsFlavor=AotLlvm -p:EnableLLVM=true -p:AndroidEnableProfiledAot=false |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it necessary to disable profiled AOT?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This one was: 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 )
<ExcludeCategories Condition=" '$(RunAOTCompilation)' == 'true' ">$(ExcludeCategories):InetAccess</ExcludeCategories> | ||
<ExcludeCategories Condition=" '$(EnableLLVM)' == 'true' ">$(ExcludeCategories):InetAccess</ExcludeCategories> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you please also open an issue for the InetAccess
test crashes with LLVM enabled?
The
I think it just says |
* main: [Mono.Android] fix crash on startup with EnableLLVM (dotnet#7188) [ci] Add Android Designer test template (dotnet#7227)
* mm-codegen: [Mono.Android] fix crash on startup with EnableLLVM (dotnet#7188) [ci] Add Android Designer test template (dotnet#7227)
`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
:java_interop_jvm_list
should never be called on Android, it is theresult of
new AndroidRuntime()
having not been called yet?The problem being that the static
Android.App.Application.cctor
wassomehow running before
JNIEnv.Initialize()
was complete? And thisonly happens with LLVM?
Reviewing the code:
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 forme.
We can also enable the LLVM
Mono.Android-Tests
again.