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
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);
}
/*