diff options
author | Elliott Hughes <enh@google.com> | 2013-04-11 16:28:38 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2013-04-11 16:43:36 -0700 |
commit | 7964f9ca0a14380a121c2757c566787b3d21bbe1 (patch) | |
tree | 33ca001392ad57d99efda7df2f81d0f89d7eb942 /vm/Thread.cpp | |
parent | 5f4b7d8a71a8d150785d2ef2e6efc2392ce985eb (diff) | |
download | android_dalvik-7964f9ca0a14380a121c2757c566787b3d21bbe1.tar.gz android_dalvik-7964f9ca0a14380a121c2757c566787b3d21bbe1.tar.bz2 android_dalvik-7964f9ca0a14380a121c2757c566787b3d21bbe1.zip |
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
Diffstat (limited to 'vm/Thread.cpp')
-rw-r--r-- | vm/Thread.cpp | 7 |
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); } /* |