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;
     }
   }
 }