From 1b4500f91a5c3841729511cd1beac1299a54e4a7 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Fri, 5 Apr 2013 15:45:24 -0700 Subject: [PATCH] Dump native stacks for all threads in native code. Bug: 7432159 (cherry picked from commit 890ce010c4846deb82d3ac09b6d2ceb76e59fb67) Change-Id: I12e9b6998f2119e0fabb5717e9c54c53f206d34f --- vm/Thread.cpp | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/vm/Thread.cpp b/vm/Thread.cpp index 5ca055fe0..c0321c105 100644 --- a/vm/Thread.cpp +++ b/vm/Thread.cpp @@ -3309,6 +3309,26 @@ static void getSchedulerStats(SchedulerStats* stats, pid_t tid) { } } +static bool shouldShowNativeStack(Thread* thread) { + // In native code somewhere in the VM? That's interesting. + if (thread->status == THREAD_VMWAIT) { + return true; + } + + // In an Object.wait variant? That's not interesting. + if (thread->status == THREAD_TIMED_WAIT || thread->status == THREAD_WAIT) { + return false; + } + + // In some other native method? That's interesting. + // We don't just check THREAD_NATIVE because native methods will be in + // state THREAD_SUSPENDED if they're calling back into the VM, or THREAD_MONITOR + // if they're blocked on a monitor, or one of the thread-startup states if + // it's early enough in their life cycle (http://b/7432159). + const Method* currentMethod = SAVEAREA_FROM_FP(thread->interpSave.curFrame)->method; + return dvmIsNativeMethod(currentMethod); +} + /* * Print information about the specified thread. * @@ -3387,16 +3407,7 @@ void dvmDumpThreadEx(const DebugOutputTarget* target, Thread* thread, dumpSchedStat(target, thread->systemTid); - /* - * Grab the native stack, if possible. - * - * The native thread is still running, even if the Dalvik side is - * suspended. This means the thread can move itself out of NATIVE state - * while we're in here, shifting to SUSPENDED after a brief moment at - * RUNNING. At that point the native stack isn't all that interesting, - * though, so if we fail to dump it there's little lost. - */ - if (thread->status == THREAD_NATIVE || thread->status == THREAD_VMWAIT) { + if (shouldShowNativeStack(thread)) { dvmDumpNativeStack(target, thread->systemTid); } -- 2.11.0