From 4c79fea9efea7cfa739cf5b5f525ddadb28e52a6 Mon Sep 17 00:00:00 2001 From: Andreas Gampe Date: Thu, 28 Jan 2016 20:11:41 -0800 Subject: [PATCH] Frameworks/base: Stop profiling on uncaught exception When "handling" an uncaught exception, make an attempt to stop profiling. In case profiling was active, this will avoid losing the profiling buffer. Bug: 26291225 Change-Id: Ie5f5517b46ed89d0456a4aac9d4ff3b713d1d8aa --- core/java/android/app/ActivityThread.java | 10 ++++++++++ core/java/com/android/internal/os/RuntimeInit.java | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 100e67badb438..99c275cf09a4e 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -4660,6 +4660,16 @@ public final class ActivityThread { } } + /** + * Public entrypoint to stop profiling. This is required to end profiling when the app crashes, + * so that profiler data won't be lost. + * + * @hide + */ + public void stopProfiling() { + mProfiler.stopProfiling(); + } + static final void handleDumpHeap(boolean managed, DumpHeapData dhd) { if (managed) { try { diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java index f81658e013442..3b8b7cb2ba2fe 100644 --- a/core/java/com/android/internal/os/RuntimeInit.java +++ b/core/java/com/android/internal/os/RuntimeInit.java @@ -86,6 +86,13 @@ public class RuntimeInit { Clog_e(TAG, message.toString(), e); } + // Try to end profiling. If a profiler is running at this point, and we kill the + // process (below), the in-memory buffer will be lost. So try to stop, which will + // flush the buffer. (This makes method trace profiling useful to debug crashes.) + if (ActivityThread.currentActivityThread() != null) { + ActivityThread.currentActivityThread().stopProfiling(); + } + // Bring up crash dialog, wait for it to be dismissed ActivityManagerNative.getDefault().handleApplicationCrash( mApplicationObject, new ApplicationErrorReport.CrashInfo(e));