summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/base/logging.cc2
-rw-r--r--runtime/indirect_reference_table.cc12
-rw-r--r--runtime/runtime.cc8
-rw-r--r--runtime/runtime.h2
4 files changed, 12 insertions, 12 deletions
diff --git a/runtime/base/logging.cc b/runtime/base/logging.cc
index 17873b541c..c305c4a2d1 100644
--- a/runtime/base/logging.cc
+++ b/runtime/base/logging.cc
@@ -64,7 +64,7 @@ static void RuntimeAborter(const char* abort_message) {
#else
UNUSED(abort_message);
#endif
- Runtime::Abort();
+ Runtime::Abort(abort_message);
}
void InitLogging(char* argv[]) {
diff --git a/runtime/indirect_reference_table.cc b/runtime/indirect_reference_table.cc
index 1eee7c481d..b742ccc4df 100644
--- a/runtime/indirect_reference_table.cc
+++ b/runtime/indirect_reference_table.cc
@@ -129,15 +129,9 @@ IndirectRef IndirectReferenceTable::Add(uint32_t cookie, mirror::Object* obj) {
DCHECK_GE(segment_state_.parts.numHoles, prevState.parts.numHoles);
if (topIndex == max_entries_) {
- std::ostringstream oss;
- oss << "JNI ERROR (app bug): " << kind_ << " table overflow "
- << "(max=" << max_entries_ << ")\n"
- << MutatorLockedDumpable<IndirectReferenceTable>(*this);
- if (VLOG_IS_ON(jni)) {
- LOG(FATAL) << oss.str();
- } else {
- LOG_FATAL_THIS_THREAD_ONLY(oss.str());
- }
+ LOG(FATAL) << "JNI ERROR (app bug): " << kind_ << " table overflow "
+ << "(max=" << max_entries_ << ")\n"
+ << MutatorLockedDumpable<IndirectReferenceTable>(*this);
}
// We know there's enough room in the table. Now we just need to find
diff --git a/runtime/runtime.cc b/runtime/runtime.cc
index df0dca0237..f6a854cd99 100644
--- a/runtime/runtime.cc
+++ b/runtime/runtime.cc
@@ -422,7 +422,7 @@ struct AbortState {
}
};
-void Runtime::Abort() {
+void Runtime::Abort(const char* msg) {
gAborting++; // set before taking any locks
// Ensure that we don't have multiple threads trying to abort at once,
@@ -437,6 +437,12 @@ void Runtime::Abort() {
AbortState state;
LOG(FATAL_WITHOUT_ABORT) << Dumpable<AbortState>(state);
+ // Sometimes we dump long messages, and the Android abort message only retains the first line.
+ // In those cases, just log the message again, to avoid logcat limits.
+ if (msg != nullptr && strchr(msg, '\n') != nullptr) {
+ LOG(FATAL_WITHOUT_ABORT) << msg;
+ }
+
// Call the abort hook if we have one.
if (Runtime::Current() != nullptr && Runtime::Current()->abort_ != nullptr) {
LOG(FATAL_WITHOUT_ABORT) << "Calling abort hook...";
diff --git a/runtime/runtime.h b/runtime/runtime.h
index 30f1b4a431..84c6b6f247 100644
--- a/runtime/runtime.h
+++ b/runtime/runtime.h
@@ -225,7 +225,7 @@ class Runtime {
// Aborts semi-cleanly. Used in the implementation of LOG(FATAL), which most
// callers should prefer.
- NO_RETURN static void Abort() REQUIRES(!Locks::abort_lock_);
+ NO_RETURN static void Abort(const char* msg) REQUIRES(!Locks::abort_lock_);
// Returns the "main" ThreadGroup, used when attaching user threads.
jobject GetMainThreadGroup() const;