OSDN Git Service

Harden the native stack dumping decision.
authorElliott Hughes <enh@google.com>
Thu, 11 Apr 2013 23:28:38 +0000 (16:28 -0700)
committerElliott Hughes <enh@google.com>
Thu, 11 Apr 2013 23:43:36 +0000 (16:43 -0700)
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

vm/Thread.cpp

index c0321c1..aba98ab 100644 (file)
@@ -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);
 }
 
 /*