Loading debuggerd/debuggerd_test.cpp +45 −0 Original line number Diff line number Diff line Loading @@ -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."); } debuggerd/libdebuggerd/tombstone_proto.cpp +5 −2 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; Loading toolbox/modprobe.cpp +36 −8 Original line number Diff line number Diff line Loading @@ -85,6 +85,26 @@ void MyLogger(android::base::LogId id, android::base::LogSeverity severity, cons } } // Find directories in format of "/lib/modules/x.y.z-*". static int KernelVersionNameFilter(const dirent* de) { unsigned int major, minor; static std::string kernel_version; utsname uts; if (kernel_version.empty()) { if ((uname(&uts) != 0) || (sscanf(uts.release, "%u.%u", &major, &minor) != 2)) { LOG(ERROR) << "Could not parse the kernel version from uname"; return 0; } kernel_version = android::base::StringPrintf("%u.%u", major, minor); } if (android::base::StartsWith(de->d_name, kernel_version)) { return 1; } return 0; } } // anonymous namespace extern "C" int modprobe_main(int argc, char** argv) { Loading Loading @@ -192,9 +212,22 @@ extern "C" int modprobe_main(int argc, char** argv) { } if (mod_dirs.empty()) { utsname uts; uname(&uts); mod_dirs.emplace_back(android::base::StringPrintf("/lib/modules/%s", uts.release)); static constexpr auto LIB_MODULES_PREFIX = "/lib/modules/"; dirent** kernel_dirs = NULL; int n = scandir(LIB_MODULES_PREFIX, &kernel_dirs, KernelVersionNameFilter, NULL); if (n == -1) { PLOG(ERROR) << "Failed to scan dir " << LIB_MODULES_PREFIX; return EXIT_FAILURE; } else if (n > 0) { while (n--) { mod_dirs.emplace_back(LIB_MODULES_PREFIX + std::string(kernel_dirs[n]->d_name)); } } free(kernel_dirs); // Allow modules to be directly inside /lib/modules mod_dirs.emplace_back(LIB_MODULES_PREFIX); } LOG(DEBUG) << "mode is " << mode; Loading @@ -212,11 +245,6 @@ extern "C" int modprobe_main(int argc, char** argv) { return EXIT_FAILURE; } } if (mod_dirs.empty()) { LOG(ERROR) << "No module configuration directories given."; print_usage(); return EXIT_FAILURE; } if (parameter_count && modules.size() > 1) { LOG(ERROR) << "Only one module may be loaded when specifying module parameters."; print_usage(); Loading Loading
debuggerd/debuggerd_test.cpp +45 −0 Original line number Diff line number Diff line Loading @@ -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."); }
debuggerd/libdebuggerd/tombstone_proto.cpp +5 −2 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; Loading
toolbox/modprobe.cpp +36 −8 Original line number Diff line number Diff line Loading @@ -85,6 +85,26 @@ void MyLogger(android::base::LogId id, android::base::LogSeverity severity, cons } } // Find directories in format of "/lib/modules/x.y.z-*". static int KernelVersionNameFilter(const dirent* de) { unsigned int major, minor; static std::string kernel_version; utsname uts; if (kernel_version.empty()) { if ((uname(&uts) != 0) || (sscanf(uts.release, "%u.%u", &major, &minor) != 2)) { LOG(ERROR) << "Could not parse the kernel version from uname"; return 0; } kernel_version = android::base::StringPrintf("%u.%u", major, minor); } if (android::base::StartsWith(de->d_name, kernel_version)) { return 1; } return 0; } } // anonymous namespace extern "C" int modprobe_main(int argc, char** argv) { Loading Loading @@ -192,9 +212,22 @@ extern "C" int modprobe_main(int argc, char** argv) { } if (mod_dirs.empty()) { utsname uts; uname(&uts); mod_dirs.emplace_back(android::base::StringPrintf("/lib/modules/%s", uts.release)); static constexpr auto LIB_MODULES_PREFIX = "/lib/modules/"; dirent** kernel_dirs = NULL; int n = scandir(LIB_MODULES_PREFIX, &kernel_dirs, KernelVersionNameFilter, NULL); if (n == -1) { PLOG(ERROR) << "Failed to scan dir " << LIB_MODULES_PREFIX; return EXIT_FAILURE; } else if (n > 0) { while (n--) { mod_dirs.emplace_back(LIB_MODULES_PREFIX + std::string(kernel_dirs[n]->d_name)); } } free(kernel_dirs); // Allow modules to be directly inside /lib/modules mod_dirs.emplace_back(LIB_MODULES_PREFIX); } LOG(DEBUG) << "mode is " << mode; Loading @@ -212,11 +245,6 @@ extern "C" int modprobe_main(int argc, char** argv) { return EXIT_FAILURE; } } if (mod_dirs.empty()) { LOG(ERROR) << "No module configuration directories given."; print_usage(); return EXIT_FAILURE; } if (parameter_count && modules.size() > 1) { LOG(ERROR) << "Only one module may be loaded when specifying module parameters."; print_usage(); Loading