ART: Relax CurrentMethodVisitor requirements on GetDexPC
In case we want to dump a Java stack after an unhandled fault, in
case we hold a thinlocked monitor, that monitor might get inflated.
That can cause an abort as we may not have enough/correct information
for the state at the bottom-most call.
Relax GetDexPc in the CurrentMethodVisitor to not abort when it cannot
find a dex pc. Instead, let the caller handle such a case. This CL
allows the locking_dex_pc_ in Monitor to be DexFile::kDexNoIndex,
which avoids the above abort.
Bug: 16352802, 16556938
Change-Id: I3adf89b2d8f018a0c3e3abdd26e542f46ee59eef
diff --git a/runtime/thread.cc b/runtime/thread.cc
index f888029..cfa2290 100644
--- a/runtime/thread.cc
+++ b/runtime/thread.cc
@@ -1970,6 +1970,8 @@
return result;
}
+// Note: this visitor may return with a method set, but dex_pc_ being DexFile:kDexNoIndex. This is
+// so we don't abort in a special situation (thinlocked monitor) when dumping the Java stack.
struct CurrentMethodVisitor FINAL : public StackVisitor {
CurrentMethodVisitor(Thread* thread, Context* context)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
@@ -1984,7 +1986,7 @@
this_object_ = GetThisObject();
}
method_ = m;
- dex_pc_ = GetDexPc();
+ dex_pc_ = GetDexPc(false); // We may not have a valid PC. Let the caller deal with it.
return false;
}
mirror::Object* this_object_;
@@ -2005,6 +2007,7 @@
Context* context = GetLongJumpContext();
CurrentMethodVisitor visitor(this, context);
visitor.WalkStack(false);
+ CHECK_NE(visitor.dex_pc_, DexFile::kDexNoIndex); // TODO: Can we relax this?
ReleaseLongJumpContext(context);
return ThrowLocation(visitor.this_object_, visitor.method_, visitor.dex_pc_);
}