diff --git a/src/coreclr/pal/src/thread/process.cpp b/src/coreclr/pal/src/thread/process.cpp index 42897270a9456f..f39ef848e0b8d6 100644 --- a/src/coreclr/pal/src/thread/process.cpp +++ b/src/coreclr/pal/src/thread/process.cpp @@ -2739,13 +2739,22 @@ static void DoNotOptimize(const void* p) --*/ #ifdef HOST_ANDROID #include +extern "C" void LogCallstackForAndroidNativeCrash() __attribute__((weak)); VOID PROCCreateCrashDumpIfEnabled(int signal, siginfo_t* siginfo, void* context, bool serialize) { // Preserve context pointer to prevent optimization DoNotOptimize(&context); - // TODO: Dump all managed threads callstacks into logcat and/or file? + if (LogCallstackForAndroidNativeCrash != nullptr) + { + minipal_log_write_fatal("\n=================================================================\n"); + minipal_log_write_fatal("\tManaged Stacktrace:\n"); + minipal_log_write_fatal("=================================================================\n"); + LogCallstackForAndroidNativeCrash(); + minipal_log_write_fatal("=================================================================\n"); + } + // TODO: Dump stress log into logcat and/or file when enabled? minipal_log_write_fatal("Aborting process.\n"); } diff --git a/src/coreclr/vm/eepolicy.cpp b/src/coreclr/vm/eepolicy.cpp index f839a962e2ebe9..ea8a8440cbdcd1 100644 --- a/src/coreclr/vm/eepolicy.cpp +++ b/src/coreclr/vm/eepolicy.cpp @@ -896,3 +896,17 @@ int NOINLINE EEPolicy::HandleFatalError(UINT exitCode, UINT_PTR address, LPCWSTR UNREACHABLE(); return -1; } + +#ifdef HOST_ANDROID +// Until Android CoreCLR is able to create dumps, provide a way for PROCCreateCrashDumpIfEnabled to log the managed callstack. +extern "C" void LogCallstackForAndroidNativeCrash() +{ + WRAPPER_NO_CONTRACT; + + Thread *pThread = GetThreadNULLOk(); + if (pThread != NULL) + { + LogCallstackForLogWorker(pThread, NULL); + } +} +#endif // HOST_ANDROID