ART: Make bad_mutexes abort message legible
Remember the actual violation and use it as the abort message.
Bug: 131324618
Test: m test-art-host
Change-Id: I4c3edb328501917b838ec1b3443e454c6ac1a13f
diff --git a/runtime/base/mutex.cc b/runtime/base/mutex.cc
index e9fa46c..0d5ce15 100644
--- a/runtime/base/mutex.cc
+++ b/runtime/base/mutex.cc
@@ -19,6 +19,8 @@
#include <errno.h>
#include <sys/time.h>
+#include <sstream>
+
#include "android-base/stringprintf.h"
#include "base/atomic.h"
@@ -187,6 +189,7 @@
CHECK(self->GetHeldMutex(level_) == this || level_ == kMonitorLock)
<< "Waiting on unacquired mutex: " << name_;
bool bad_mutexes_held = false;
+ std::string error_msg;
for (int i = kLockLevelCount - 1; i >= 0; --i) {
if (i != level_) {
BaseMutex* held_mutex = self->GetHeldMutex(static_cast<LockLevel>(i));
@@ -205,22 +208,28 @@
return self->GetUserCodeSuspendCount() != 0;
};
if (is_suspending_for_user_code()) {
- LOG(ERROR) << "Holding \"" << held_mutex->name_ << "\" "
- << "(level " << LockLevel(i) << ") while performing wait on "
- << "\"" << name_ << "\" (level " << level_ << ") "
- << "with SuspendReason::kForUserCode pending suspensions";
+ std::ostringstream oss;
+ oss << "Holding \"" << held_mutex->name_ << "\" "
+ << "(level " << LockLevel(i) << ") while performing wait on "
+ << "\"" << name_ << "\" (level " << level_ << ") "
+ << "with SuspendReason::kForUserCode pending suspensions";
+ error_msg = oss.str();
+ LOG(ERROR) << error_msg;
bad_mutexes_held = true;
}
} else if (held_mutex != nullptr) {
- LOG(ERROR) << "Holding \"" << held_mutex->name_ << "\" "
- << "(level " << LockLevel(i) << ") while performing wait on "
- << "\"" << name_ << "\" (level " << level_ << ")";
+ std::ostringstream oss;
+ oss << "Holding \"" << held_mutex->name_ << "\" "
+ << "(level " << LockLevel(i) << ") while performing wait on "
+ << "\"" << name_ << "\" (level " << level_ << ")";
+ error_msg = oss.str();
+ LOG(ERROR) << error_msg;
bad_mutexes_held = true;
}
}
}
if (gAborting == 0) { // Avoid recursive aborts.
- CHECK(!bad_mutexes_held) << this;
+ CHECK(!bad_mutexes_held) << error_msg;
}
}
}