summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2013-04-11 16:28:38 -0700
committerElliott Hughes <enh@google.com>2013-04-11 16:43:36 -0700
commit7964f9ca0a14380a121c2757c566787b3d21bbe1 (patch)
tree33ca001392ad57d99efda7df2f81d0f89d7eb942
parent5f4b7d8a71a8d150785d2ef2e6efc2392ce985eb (diff)
downloaddalvik-7964f9ca0a14380a121c2757c566787b3d21bbe1.tar.gz
Harden the native stack dumping decision.
We've seen monkey crashes in this code, though I haven't been able to reproduce them in my own SIGQUIT stress tests. Address the two most likely causes of trouble: dumping the signal catcher's own thread (which will always be runnable), and assuming that the Method* pulled from the save area is non-NULL. (cherry-pick of feddac5b7718dd8141391bfeb6359f1906542823.) Bug: 8596028 Change-Id: I7a70ce047c8285715eb7bbb9438e8ef5d81fc59c
-rw-r--r--vm/Thread.cpp7
1 files changed, 6 insertions, 1 deletions
diff --git a/vm/Thread.cpp b/vm/Thread.cpp
index c0321c105..aba98ab73 100644
--- a/vm/Thread.cpp
+++ b/vm/Thread.cpp
@@ -3320,13 +3320,18 @@ static bool shouldShowNativeStack(Thread* thread) {
return false;
}
+ // The Signal Catcher thread? That's not interesting.
+ if (thread->status == THREAD_RUNNING) {
+ 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);
+ return currentMethod != NULL && dvmIsNativeMethod(currentMethod);
}
/*