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
diff --git a/vm/Thread.cpp b/vm/Thread.cpp
index c0321c1..aba98ab 100644
--- a/vm/Thread.cpp
+++ b/vm/Thread.cpp
@@ -3320,13 +3320,18 @@
         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);
 }
 
 /*