Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

NativeAOT: a fatal managed exception on the main thread leaves the process alive (propagateUncaughtException has no native implementation)

Aperta
#13,141 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
Più di una settimana
Idoneità per principianti
18/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
android, c, csharp, java

Direzione di ricerca

The failing lookup is the native propagateUncaughtException declared in src/java-runtime/java/mono/android/Runtime.java; the CoreCLR counterpart is in src/native/clr/host/host-jni.cc. Start by finding where the NativeAOT runtime should provide the matching JNI symbol and why it is missing. Done would mean a fatal managed exception on the main thread terminates the process under PublishAot, confirmed by the repro in the issue.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

needs-triage
Android framework version

net10.0-android

Affected platform version

.NET SDK 10.0.401, Microsoft.Android.Sdk 36.1.69, PublishAot=true, android-x64 on an API 35 emulator (Google APIs Play Store x86_64 image). I have not tried arm64.

Description

With NativeAOT, an unhandled managed exception on the main thread does not terminate the app. The process stays alive (adb shell ps still lists it), the UI stays wherever it was, and the crash dialog never shows. The same app built without PublishAot dies as expected.

The managed exception is logged as a FATAL EXCEPTION: main from AndroidRuntime (a JavaProxyThrowable wrapping the managed exception), then logcat shows:

E ame.ZombieRepro: No implementation found for void mono.android.Runtime.propagateUncaughtException(java.lang.Thread, java.lang.Throwable) (tried Java_mono_android_Runtime_propagateUncaughtException and Java_mono_android_Runtime_propagateUncaughtException__Ljava_lang_Thread_2Ljava_lang_Throwable_2) - is the library loaded, e.g. System.loadLibrary?

propagateUncaughtException is declared native in src/java-runtime/java/mono/android/Runtime.java. The CoreCLR host exports it (src/native/clr/host/host-jni.cc, libnet-android.map.txt). I could not find a NativeAOT counterpart by code search (not stepped through, happy to be corrected). So the JNI lookup fails and the default handler never kills the process.

The same log line is pasted in a comment in tests/MSBuildDeviceIntegration/Tests/InstallAndRunTests.cs (the NativeAOT branch of AppWithStyleableUsageRuns), so the existing tests hit it too.

Impact: a startup crash looks like a hang. Anything that detects crashes by process death never sees one. We only found this because our CI waited out its whole job timeout.

Related: #10657 / #10658 (the CoreCLR equivalent, closed) and the NativeAOT TODO list #9784 (it mentions that AppDomain.CurrentDomain.UnhandledException is skipped under NativeAOT). I found no issue covering this symptom.

Steps to Reproduce

Verified on a blank app, no third-party packages.

  1. dotnet new android -n ZombieRepro
  2. In ZombieRepro.csproj add:
    <PublishAot>true</PublishAot>
    <RuntimeIdentifier>android-x64</RuntimeIdentifier>
    
  3. In MainActivity.OnCreate, before anything else: throw new InvalidOperationException("boom");
  4. dotnet publish -c Release -f net10.0-android (needs an NDK clang on PATH and -p:AndroidNdkDirectory=<ndk>), then adb install the -Signed.apk and launch it.
  5. Wait about 15 seconds. adb shell ps -A | grep -i zombie still lists the process (state S), and adb logcat -d | grep propagateUncaughtException shows the "No implementation found" line.
  6. Set PublishAot to false, rebuild, reinstall, launch: the process is gone after the same wait and only the FATAL EXCEPTION is logged.
Did you find any workaround?

Detect the crash from adb logcat -d -b crash (Process: <appid>, lines) instead of process death. An in-app option might be to hook AppDomain.CurrentDomain.UnhandledException and call Process.KillProcess(Process.MyPid()), but I haven't tried it, and #9784 says that event is skipped under NativeAOT.

Relevant log output
E AndroidRuntime: FATAL EXCEPTION: main
E AndroidRuntime: Process: com.companyname.ZombieRepro, PID: 4449
E AndroidRuntime: net.dot.jni.internal.JavaProxyThrowable: System.InvalidOperationException: boom
E AndroidRuntime:    at ZombieRepro.MainActivity.OnCreate(Bundle savedInstanceState) + 0x27
...
E ame.ZombieRepro: No implementation found for void mono.android.Runtime.propagateUncaughtException(java.lang.Thread, java.lang.Throwable) ...
Lingua principale
C#
Stelle
2.1k
Fork
581
Merge medio
1g 21h
PR unite (30g)
241

Preparare l'ambiente

  • Nessun Dockerfile né file Docker Compose
  • Ha un modello di pull request
  • Nessuna guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di dotnet/android

Tutte le issue di dotnet/android

Issue simili

Altre issue su C#

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.