diff --git a/debuggerd/debuggerd_test.cpp b/debuggerd/debuggerd_test.cpp index 39d7fff1c..4cd619337 100644 --- a/debuggerd/debuggerd_test.cpp +++ b/debuggerd/debuggerd_test.cpp @@ -2759,3 +2759,48 @@ TEST_F(CrasherTest, logd_skips_reading_logs_not_main_thread) { ASSERT_BACKTRACE_FRAME(result, "raise_debugger_signal"); ASSERT_NOT_MATCH(result, kLogMessage); } + +// Disable this test since there is a high liklihood that this would +// be flaky since it requires 500 messages being in the log. +TEST_F(CrasherTest, DISABLED_max_log_messages) { + StartProcess([]() { + for (size_t i = 0; i < 600; i++) { + LOG(INFO) << "Message number " << i; + } + abort(); + }); + + unique_fd output_fd; + StartIntercept(&output_fd); + FinishCrasher(); + AssertDeath(SIGABRT); + int intercept_result; + FinishIntercept(&intercept_result); + ASSERT_EQ(1, intercept_result) << "tombstoned reported failure"; + + std::string result; + ConsumeFd(std::move(output_fd), &result); + ASSERT_NOT_MATCH(result, "Message number 99"); + ASSERT_MATCH(result, "Message number 100"); + ASSERT_MATCH(result, "Message number 599"); +} + +TEST_F(CrasherTest, log_with_newline) { + StartProcess([]() { + LOG(INFO) << "This line has a newline.\nThis is on the next line."; + abort(); + }); + + unique_fd output_fd; + StartIntercept(&output_fd); + FinishCrasher(); + AssertDeath(SIGABRT); + int intercept_result; + FinishIntercept(&intercept_result); + ASSERT_EQ(1, intercept_result) << "tombstoned reported failure"; + + std::string result; + ConsumeFd(std::move(output_fd), &result); + ASSERT_MATCH(result, ":\\s*This line has a newline."); + ASSERT_MATCH(result, ":\\s*This is on the next line."); +} diff --git a/debuggerd/libdebuggerd/tombstone_proto.cpp b/debuggerd/libdebuggerd/tombstone_proto.cpp index acd814efa..7b2e0689e 100644 --- a/debuggerd/libdebuggerd/tombstone_proto.cpp +++ b/debuggerd/libdebuggerd/tombstone_proto.cpp @@ -70,6 +70,9 @@ using android::base::StringPrintf; +// The maximum number of messages to save in the protobuf per file. +static constexpr size_t kMaxLogMessages = 500; + // Use the demangler from libc++. extern "C" char* __cxa_demangle(const char*, char*, size_t*, int* status); @@ -491,8 +494,8 @@ static void dump_mappings(Tombstone* tombstone, unwindstack::Maps* maps, } static void dump_log_file(Tombstone* tombstone, const char* logger, pid_t pid) { - logger_list* logger_list = - android_logger_list_open(android_name_to_log_id(logger), ANDROID_LOG_NONBLOCK, 0, pid); + logger_list* logger_list = android_logger_list_open(android_name_to_log_id(logger), + ANDROID_LOG_NONBLOCK, kMaxLogMessages, pid); LogBuffer buffer;