From fc24b5a7cf53ae6b65145bb779ebe466835ec9be Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Tue, 15 Oct 2019 22:08:07 +0200 Subject: [PATCH 1/7] Try to find out reason for a weird runtime crash The crash is: 10-15 14:25:04.854 3342 3342 E mono : 10-15 14:25:04.854 3342 3342 E mono : Unhandled Exception: 10-15 14:25:04.854 3342 3342 E mono : System.DllNotFoundException: __Internal assembly: type: member:(null) 10-15 14:25:04.854 3342 3342 E mono : at (wrapper managed-to-native) Android.Runtime.JNIEnv.monodroid_timing_start(string) 10-15 14:25:04.854 3342 3342 E mono : at Android.Runtime.JNIEnv.Initialize (Android.Runtime.JnienvInitializeArgs* args) [0x0001c] in <1260048817b5414c97481e16c94f6621>:0 It's one of those cases that are "impossible", try to find out how possible is the impossible --- src/monodroid/jni/monodroid-glue.cc | 3 +++ tests/Runtime-AppBundle/Environment.txt | 4 ++++ tests/Runtime-AppBundle/Mono.Android-TestsAppBundle.csproj | 1 + 3 files changed, 8 insertions(+) create mode 100644 tests/Runtime-AppBundle/Environment.txt diff --git a/src/monodroid/jni/monodroid-glue.cc b/src/monodroid/jni/monodroid-glue.cc index 87552e105f1..5107cea2379 100644 --- a/src/monodroid/jni/monodroid-glue.cc +++ b/src/monodroid/jni/monodroid-glue.cc @@ -1058,6 +1058,9 @@ MonodroidRuntime::monodroid_dlopen_log_and_return (void *handle, char **err, con void* MonodroidRuntime::monodroid_dlopen (const char *name, int flags, char **err, void *user_data) { + log_warn (LOG_DEFAULT, "%s called", __PRETTY_FUNCTION__); + log_warn (LOG_DEFAULT, " name == %s; flags == 0x%X", name == nullptr ? "" : name, flags); + int dl_flags = monodroidRuntime.convert_dl_flags (flags); bool libmonodroid_fallback = false; diff --git a/tests/Runtime-AppBundle/Environment.txt b/tests/Runtime-AppBundle/Environment.txt new file mode 100644 index 00000000000..ba117b60829 --- /dev/null +++ b/tests/Runtime-AppBundle/Environment.txt @@ -0,0 +1,4 @@ +debug.mono.debug=1 +MONO_LOG_LEVEL=debug +MONO_LOG_MASK=asm +MONO_XDEBUG=1 diff --git a/tests/Runtime-AppBundle/Mono.Android-TestsAppBundle.csproj b/tests/Runtime-AppBundle/Mono.Android-TestsAppBundle.csproj index 99cca0f8f15..20a705ca41a 100644 --- a/tests/Runtime-AppBundle/Mono.Android-TestsAppBundle.csproj +++ b/tests/Runtime-AppBundle/Mono.Android-TestsAppBundle.csproj @@ -106,6 +106,7 @@ Assets\subfolder\accept_request.png + From 617a93932d3dbedff3c741f36ddbd95bdc963ef2 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Tue, 5 Nov 2019 14:49:08 +0100 Subject: [PATCH 2/7] More logging --- src/monodroid/jni/monodroid-glue.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/monodroid/jni/monodroid-glue.cc b/src/monodroid/jni/monodroid-glue.cc index 5107cea2379..20302483715 100644 --- a/src/monodroid/jni/monodroid-glue.cc +++ b/src/monodroid/jni/monodroid-glue.cc @@ -1052,6 +1052,7 @@ MonodroidRuntime::monodroid_dlopen_log_and_return (void *handle, char **err, con delete[] full_name; } + log_warn (LOG_DEFAULT, " returning handle == %p", handle); return handle; } @@ -1059,7 +1060,7 @@ void* MonodroidRuntime::monodroid_dlopen (const char *name, int flags, char **err, void *user_data) { log_warn (LOG_DEFAULT, "%s called", __PRETTY_FUNCTION__); - log_warn (LOG_DEFAULT, " name == %s; flags == 0x%X", name == nullptr ? "" : name, flags); + log_warn (LOG_DEFAULT, " name == %s; flags == 0x%X; err == %p", name == nullptr ? "" : name, flags, err); int dl_flags = monodroidRuntime.convert_dl_flags (flags); bool libmonodroid_fallback = false; @@ -1068,15 +1069,18 @@ MonodroidRuntime::monodroid_dlopen (const char *name, int flags, char **err, voi if (name == nullptr) { name = "libmonodroid.so"; libmonodroid_fallback = TRUE; + log_warn (LOG_DEFAULT, " internal call, name remapped to %s", name); } void *h = androidSystem.load_dso_from_any_directories (name, dl_flags); + log_warn (LOG_DEFAULT, " first load attempt, h == %p", h); if (h != nullptr) { return monodroid_dlopen_log_and_return (h, err, name, false); } if (libmonodroid_fallback) { char *full_name = utils.path_combine (AndroidSystem::SYSTEM_LIB_PATH, "libmonodroid.so"); + log_warn (LOG_DEFAULT," fallback, looking in %s", full_name); h = androidSystem.load_dso (full_name, dl_flags, false); return monodroid_dlopen_log_and_return (h, err, full_name, true); } From c36b724278a6966079c53852f55e0e8e7d486ed7 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Tue, 5 Nov 2019 17:37:03 +0100 Subject: [PATCH 3/7] More logging --- src/monodroid/jni/android-system.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/monodroid/jni/android-system.cc b/src/monodroid/jni/android-system.cc index 70ab5a5949d..897bc71a07f 100644 --- a/src/monodroid/jni/android-system.cc +++ b/src/monodroid/jni/android-system.cc @@ -373,21 +373,23 @@ AndroidSystem::load_dso (const char *path, int dl_flags, bool skip_exists_check) if (path == nullptr || *path == '\0') return nullptr; - log_info (LOG_ASSEMBLY, "Trying to load shared library '%s'", path); + log_warn (LOG_ASSEMBLY, "Trying to load shared library '%s'", path); if (!skip_exists_check && !is_embedded_dso_mode_enabled () && !utils.file_exists (path)) { - log_info (LOG_ASSEMBLY, "Shared library '%s' not found", path); + log_warn (LOG_ASSEMBLY, "Shared library '%s' not found", path); return nullptr; } void *handle = dlopen (path, dl_flags); - if (handle == nullptr && utils.should_log (LOG_ASSEMBLY)) - log_info_nocheck (LOG_ASSEMBLY, "Failed to load shared library '%s'. %s", path, dlerror ()); + if (handle == nullptr) + log_warn (LOG_ASSEMBLY, "Failed to load shared library '%s'. %s", path, dlerror ()); return handle; } void* AndroidSystem::load_dso_from_specified_dirs (const char **directories, size_t num_entries, const char *dso_name, int dl_flags) { + log_warn (LOG_DEFAULT, "%s called", __PRETTY_FUNCTION__); + log_warn (LOG_DEFAULT, " dso_name == %s", dso_name); assert (directories != nullptr); if (dso_name == nullptr) return nullptr; @@ -396,6 +398,7 @@ AndroidSystem::load_dso_from_specified_dirs (const char **directories, size_t nu char *full_path = nullptr; for (size_t i = 0; i < num_entries; i++) { full_path = get_full_dso_path (directories [i], dso_name, needs_free); + log_warn (LOG_DEFAULT, " trying %s", full_path); void *handle = load_dso (full_path, dl_flags, false); if (needs_free) delete[] full_path; From d727f6622de36d04e0d5e99796320484d55792f1 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 7 Nov 2019 17:30:01 +0100 Subject: [PATCH 4/7] More logging See if embedded DSO mode is enabled - it should be, but sometimes it appears as if it isn't set and thus we get invalid paths where to look for our DSOs --- src/monodroid/jni/basic-android-system.cc | 7 +++++-- src/monodroid/jni/monodroid-glue.cc | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/monodroid/jni/basic-android-system.cc b/src/monodroid/jni/basic-android-system.cc index 67ee26bf59b..92ffbdf5df2 100644 --- a/src/monodroid/jni/basic-android-system.cc +++ b/src/monodroid/jni/basic-android-system.cc @@ -13,13 +13,16 @@ size_t BasicAndroidSystem::app_lib_directories_size = 0; void BasicAndroidSystem::setup_app_library_directories (JNIEnv *env, jstring_array_wrapper& runtimeApks, jstring_array_wrapper& appDirs, int androidApiLevel) { + log_warn (LOG_DEFAULT, "%s called", __PRETTY_FUNCTION__); + log_warn (LOG_DEFAULT, " API level == %d", androidApiLevel); + log_warn (LOG_DEFAULT, " is_embedded_dso_mode_enabled == %s", is_embedded_dso_mode_enabled () ? "true" : "false"); if (androidApiLevel < 23 || !is_embedded_dso_mode_enabled ()) { - log_info (LOG_DEFAULT, "Setting up for DSO lookup in app data directories"); + log_warn (LOG_DEFAULT, "Setting up for DSO lookup in app data directories"); BasicAndroidSystem::app_lib_directories_size = 1; BasicAndroidSystem::app_lib_directories = reinterpret_cast(new char[app_lib_directories_size]()); BasicAndroidSystem::app_lib_directories [0] = utils.strdup_new (appDirs[2].get_cstr ()); } else { - log_info (LOG_DEFAULT, "Setting up for DSO lookup directly in the APK"); + log_warn (LOG_DEFAULT, "Setting up for DSO lookup directly in the APK"); BasicAndroidSystem::app_lib_directories_size = runtimeApks.get_length (); BasicAndroidSystem::app_lib_directories = reinterpret_cast(new char[app_lib_directories_size]()); diff --git a/src/monodroid/jni/monodroid-glue.cc b/src/monodroid/jni/monodroid-glue.cc index 20302483715..94412ab6d14 100644 --- a/src/monodroid/jni/monodroid-glue.cc +++ b/src/monodroid/jni/monodroid-glue.cc @@ -1392,6 +1392,8 @@ MonodroidRuntime::Java_mono_android_Runtime_initInternal (JNIEnv *env, jclass kl jobjectArray externalStorageDirs, jobjectArray assembliesJava, jint apiLevel, jboolean embeddedDSOsEnabled, jboolean isEmulator) { + log_warn (LOG_DEFAULT, "%s called", __PRETTY_FUNCTION__); + log_warn (LOG_DEFAULT, " embeddedDSOsEnabled == %u", embeddedDSOsEnabled); init_logging_categories (); timing_period total_time; From e7d7239c5f4bd2cb8fa1461afec35735c70d713d Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 7 Nov 2019 19:04:47 +0100 Subject: [PATCH 5/7] Log all the apk paths --- src/monodroid/jni/basic-android-system.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/monodroid/jni/basic-android-system.cc b/src/monodroid/jni/basic-android-system.cc index 92ffbdf5df2..e785d815995 100644 --- a/src/monodroid/jni/basic-android-system.cc +++ b/src/monodroid/jni/basic-android-system.cc @@ -49,7 +49,11 @@ BasicAndroidSystem::add_apk_libdir (const char *apk, size_t index, size_t apk_co { assert (user_data != nullptr); assert (index >= 0 && index < app_lib_directories_size); + log_warn (LOG_DEFAULT, "%s called", __PRETTY_FUNCTION__); + log_warn (LOG_DEFAULT, " apk #%u out of %u == %s", index, apk_count, apk); + log_warn (LOG_DEFAULT, " user_data == %s", static_cast(user_data)); app_lib_directories [index] = utils.string_concat (apk, "!/lib/", static_cast(user_data)); + log_warn (LOG_DEFAULT, " added path: %s", app_lib_directories [index]); } void From 79d7b1e24abb07db0c60478a01602357b72702ec Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 7 Nov 2019 19:21:37 +0100 Subject: [PATCH 6/7] Log more about DSO paths --- src/monodroid/jni/android-system.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/monodroid/jni/android-system.cc b/src/monodroid/jni/android-system.cc index 897bc71a07f..1a28866aed9 100644 --- a/src/monodroid/jni/android-system.cc +++ b/src/monodroid/jni/android-system.cc @@ -356,15 +356,22 @@ AndroidSystem::create_update_dir (char *override_dir) char* AndroidSystem::get_full_dso_path (const char *base_dir, const char *dso_path, bool &needs_free) { + log_warn (LOG_DEFAULT, "%s called", __PRETTY_FUNCTION__); + log_warn (LOG_DEFAULT, " base_dir == %s", base_dir); + log_warn (LOG_DEFAULT, " dso_path == %s", dso_path); needs_free = false; if (dso_path == nullptr) return nullptr; - if (base_dir == nullptr || utils.is_path_rooted (dso_path)) + if (base_dir == nullptr || utils.is_path_rooted (dso_path)) { + log_warn (LOG_DEFAULT, " no base dir or dso_path rooted, returning: %s", dso_path); return const_cast(dso_path); // Absolute path or no base path, can't do much with it + } needs_free = true; - return utils.path_combine (base_dir, dso_path); + char *ret = utils.path_combine (base_dir, dso_path); + log_warn (LOG_DEFAULT, " returning %s", ret); + return ret; } void* @@ -390,6 +397,7 @@ AndroidSystem::load_dso_from_specified_dirs (const char **directories, size_t nu { log_warn (LOG_DEFAULT, "%s called", __PRETTY_FUNCTION__); log_warn (LOG_DEFAULT, " dso_name == %s", dso_name); + log_warn (LOG_DEFAULT, " num_entries == %u", num_entries); assert (directories != nullptr); if (dso_name == nullptr) return nullptr; From ffc161cdbd21f4f5867f20fdeb7478cdda3edbb7 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Thu, 7 Nov 2019 20:32:51 +0100 Subject: [PATCH 7/7] OOps --- src/monodroid/jni/basic-android-system.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/monodroid/jni/basic-android-system.cc b/src/monodroid/jni/basic-android-system.cc index e785d815995..9667d65c2de 100644 --- a/src/monodroid/jni/basic-android-system.cc +++ b/src/monodroid/jni/basic-android-system.cc @@ -19,18 +19,24 @@ BasicAndroidSystem::setup_app_library_directories (JNIEnv *env, jstring_array_wr if (androidApiLevel < 23 || !is_embedded_dso_mode_enabled ()) { log_warn (LOG_DEFAULT, "Setting up for DSO lookup in app data directories"); BasicAndroidSystem::app_lib_directories_size = 1; - BasicAndroidSystem::app_lib_directories = reinterpret_cast(new char[app_lib_directories_size]()); - BasicAndroidSystem::app_lib_directories [0] = utils.strdup_new (appDirs[2].get_cstr ()); + BasicAndroidSystem::app_lib_directories = new const char*[app_lib_directories_size](); + BasicAndroidSystem::app_lib_directories [0] = utils.strdup_new (appDirs[2].get_cstr()); } else { log_warn (LOG_DEFAULT, "Setting up for DSO lookup directly in the APK"); BasicAndroidSystem::app_lib_directories_size = runtimeApks.get_length (); - BasicAndroidSystem::app_lib_directories = reinterpret_cast(new char[app_lib_directories_size]()); + BasicAndroidSystem::app_lib_directories = new const char*[app_lib_directories_size](); unsigned short built_for_cpu = 0, running_on_cpu = 0; unsigned char is64bit = 0; _monodroid_detect_cpu_and_architecture (&built_for_cpu, &running_on_cpu, &is64bit); setup_apk_directories (env, running_on_cpu, runtimeApks); } + + log_warn (LOG_DEFAULT, " app_lib_directories_size == %u", app_lib_directories_size); + log_warn (LOG_DEFAULT, " directories:"); + for (size_t i = 0; i < app_lib_directories_size; i++) { + log_warn (LOG_DEFAULT, " app_lib_directories [%u] == %s", i, BasicAndroidSystem::app_lib_directories [i]); + } } void