| Index: user_collector.cc
|
| diff --git a/user_collector.cc b/user_collector.cc
|
| index 6e6c76596c649c3a6b696c4f35daeb951c747ab9..4ea770f692e135803723fcf4843cf068abf1a19b 100644
|
| --- a/user_collector.cc
|
| +++ b/user_collector.cc
|
| @@ -16,7 +16,8 @@
|
| #include "base/file_util.h"
|
| #include "base/logging.h"
|
| #include "base/string_util.h"
|
| -#include "crash-reporter/system_logging.h"
|
| +#include "chromeos/process.h"
|
| +#include "chromeos/syslog_logging.h"
|
| #include "gflags/gflags.h"
|
|
|
| #pragma GCC diagnostic ignored "-Wstrict-aliasing"
|
| @@ -55,11 +56,9 @@ void UserCollector::Initialize(
|
| UserCollector::CountCrashFunction count_crash_function,
|
| const std::string &our_path,
|
| UserCollector::IsFeedbackAllowedFunction is_feedback_allowed_function,
|
| - SystemLogging *logger,
|
| bool generate_diagnostics) {
|
| CrashCollector::Initialize(count_crash_function,
|
| - is_feedback_allowed_function,
|
| - logger);
|
| + is_feedback_allowed_function);
|
| our_path_ = our_path;
|
| initialized_ = true;
|
| generate_diagnostics_ = generate_diagnostics;
|
| @@ -82,13 +81,13 @@ std::string UserCollector::GetPattern(bool enabled) const {
|
|
|
| bool UserCollector::SetUpInternal(bool enabled) {
|
| CHECK(initialized_);
|
| - logger_->LogInfo("%s user crash handling",
|
| - enabled ? "Enabling" : "Disabling");
|
| + LOG(INFO) << (enabled ? "Enabling" : "Disabling") << " user crash handling";
|
| +
|
| if (file_util::WriteFile(FilePath(core_pipe_limit_file_),
|
| kCorePipeLimit,
|
| strlen(kCorePipeLimit)) !=
|
| static_cast<int>(strlen(kCorePipeLimit))) {
|
| - logger_->LogError("Unable to write %s", core_pipe_limit_file_.c_str());
|
| + LOG(ERROR) << "Unable to write " << core_pipe_limit_file_;
|
| return false;
|
| }
|
| std::string pattern = GetPattern(enabled);
|
| @@ -96,7 +95,7 @@ bool UserCollector::SetUpInternal(bool enabled) {
|
| pattern.c_str(),
|
| pattern.length()) !=
|
| static_cast<int>(pattern.length())) {
|
| - logger_->LogError("Unable to write %s", core_pattern_file_.c_str());
|
| + LOG(ERROR) << "Unable to write " << core_pattern_file_;
|
| return false;
|
| }
|
| return true;
|
| @@ -115,8 +114,8 @@ bool UserCollector::GetSymlinkTarget(const FilePath &symlink,
|
| ssize_t size = readlink(symlink.value().c_str(), buffer.get(), max_size);
|
| if (size < 0) {
|
| int saved_errno = errno;
|
| - logger_->LogError("Readlink failed on %s with %d",
|
| - symlink.value().c_str(), saved_errno);
|
| + LOG(ERROR) << "Readlink failed on " << symlink.value() << " with "
|
| + << saved_errno;
|
| return false;
|
| }
|
| buffer[size] = 0;
|
| @@ -142,19 +141,19 @@ bool UserCollector::GetExecutableBaseNameFromPid(uid_t pid,
|
| FilePath process_path = GetProcessPath(pid);
|
| FilePath exe_path = process_path.Append("exe");
|
| if (!GetSymlinkTarget(exe_path, &target)) {
|
| - logger_->LogInfo("GetSymlinkTarget failed - Path %s DirectoryExists: %d",
|
| - process_path.value().c_str(),
|
| - file_util::DirectoryExists(process_path));
|
| + LOG(INFO) << "GetSymlinkTarget failed - Path " << process_path.value()
|
| + << " DirectoryExists: "
|
| + << file_util::DirectoryExists(process_path);
|
| // Try to further diagnose exe readlink failure cause.
|
| struct stat buf;
|
| int stat_result = stat(exe_path.value().c_str(), &buf);
|
| int saved_errno = errno;
|
| if (stat_result < 0) {
|
| - logger_->LogInfo("stat %s failed: %d %d", exe_path.value().c_str(),
|
| - stat_result, saved_errno);
|
| + LOG(INFO) << "stat " << exe_path.value() << " failed: " << stat_result
|
| + << " " << saved_errno;
|
| } else {
|
| - logger_->LogInfo("stat %s succeeded: st_mode=%d",
|
| - exe_path.value().c_str(), buf.st_mode);
|
| + LOG(INFO) << "stat " << exe_path.value() << " succeeded: st_mode="
|
| + << buf.st_mode;
|
| }
|
| return false;
|
| }
|
| @@ -198,13 +197,13 @@ bool UserCollector::GetIdFromStatus(const char *prefix,
|
| void UserCollector::EnqueueCollectionErrorLog(pid_t pid,
|
| const std::string &exec) {
|
| FilePath crash_path;
|
| - logger_->LogInfo("Writing conversion problems as separate crash report.");
|
| + LOG(INFO) << "Writing conversion problems as separate crash report.";
|
| if (!GetCreatedCrashDirectoryByEuid(0, &crash_path, NULL)) {
|
| - logger_->LogError("Could not even get log directory; out of space?");
|
| + LOG(ERROR) << "Could not even get log directory; out of space?";
|
| return;
|
| }
|
| std::string dump_basename = FormatDumpBasename(exec, time(NULL), pid);
|
| - std::string error_log = logger_->get_accumulator();
|
| + std::string error_log = syslog_logging::GetAccumulatedLogging();
|
| FilePath diag_log_path = GetCrashPath(crash_path, dump_basename, "diaglog");
|
| if (GetLogContents(FilePath(kDefaultLogConfig), kCollectionErrorSignature,
|
| diag_log_path)) {
|
| @@ -229,13 +228,12 @@ void UserCollector::EnqueueCollectionErrorLog(pid_t pid,
|
| bool UserCollector::CopyOffProcFiles(pid_t pid,
|
| const FilePath &container_dir) {
|
| if (!file_util::CreateDirectory(container_dir)) {
|
| - logger_->LogError("Could not create %s",
|
| - container_dir.value().c_str());
|
| + LOG(ERROR) << "Could not create " << container_dir.value().c_str();
|
| return false;
|
| }
|
| FilePath process_path = GetProcessPath(pid);
|
| if (!file_util::PathExists(process_path)) {
|
| - logger_->LogError("Path %s does not exist", process_path.value().c_str());
|
| + LOG(ERROR) << "Path " << process_path.value() << " does not exist";
|
| return false;
|
| }
|
| static const char *proc_files[] = {
|
| @@ -248,7 +246,7 @@ bool UserCollector::CopyOffProcFiles(pid_t pid,
|
| for (unsigned i = 0; i < arraysize(proc_files); ++i) {
|
| if (!file_util::CopyFile(process_path.Append(proc_files[i]),
|
| container_dir.Append(proc_files[i]))) {
|
| - logger_->LogError("Could not copy %s file", proc_files[i]);
|
| + LOG(ERROR) << "Could not copy " << proc_files[i] << " file";
|
| return false;
|
| }
|
| }
|
| @@ -261,26 +259,25 @@ bool UserCollector::GetCreatedCrashDirectory(pid_t pid,
|
| FilePath process_path = GetProcessPath(pid);
|
| std::string status;
|
| if (FLAGS_directory_failure) {
|
| - logger_->LogError("Purposefully failing to create spool directory");
|
| + LOG(ERROR) << "Purposefully failing to create spool directory";
|
| return false;
|
| }
|
| if (!file_util::ReadFileToString(process_path.Append("status"),
|
| &status)) {
|
| - logger_->LogError("Could not read status file");
|
| - logger_->LogInfo("Path %s DirectoryExists: %d",
|
| - process_path.value().c_str(),
|
| - file_util::DirectoryExists(process_path));
|
| + LOG(ERROR) << "Could not read status file";
|
| + LOG(INFO) << "Path " << process_path.value() << " DirectoryExists: "
|
| + << file_util::DirectoryExists(process_path);
|
| return false;
|
| }
|
| int process_euid;
|
| if (!GetIdFromStatus(kUserId, kIdEffective, status, &process_euid)) {
|
| - logger_->LogError("Could not find euid in status file");
|
| + LOG(ERROR) << "Could not find euid in status file";
|
| return false;
|
| }
|
| if (!GetCreatedCrashDirectoryByEuid(process_euid,
|
| crash_file_path,
|
| out_of_capacity)) {
|
| - logger_->LogError("Could not create crash directory");
|
| + LOG(ERROR) << "Could not create crash directory";
|
| return false;
|
| }
|
| return true;
|
| @@ -293,7 +290,7 @@ bool UserCollector::CopyStdinToCoreFile(const FilePath &core_path) {
|
| return true;
|
| }
|
|
|
| - logger_->LogError("Could not write core file");
|
| + LOG(ERROR) << "Could not write core file";
|
| // If the file system was full, make sure we remove any remnants.
|
| file_util::Delete(core_path, false);
|
| return false;
|
| @@ -304,34 +301,32 @@ bool UserCollector::RunCoreToMinidump(const FilePath &core_path,
|
| const FilePath &minidump_path,
|
| const FilePath &temp_directory) {
|
| FilePath output_path = temp_directory.Append("output");
|
| - std::vector<const char *> core2md_arguments;
|
| - core2md_arguments.push_back(kCoreToMinidumpConverterPath);
|
| - core2md_arguments.push_back(core_path.value().c_str());
|
| - core2md_arguments.push_back(procfs_directory.value().c_str());
|
| - core2md_arguments.push_back(minidump_path.value().c_str());
|
| -
|
| - if (FLAGS_core2md_failure) {
|
| + ProcessImpl core2md;
|
| + core2md.SetOutput(output_path.value());
|
| + core2md.AddArg(kCoreToMinidumpConverterPath);
|
| + core2md.AddArg(core_path.value());
|
| + core2md.AddArg(procfs_directory.value());
|
| +
|
| + if (!FLAGS_core2md_failure) {
|
| + core2md.AddArg(minidump_path.value());
|
| + } else {
|
| // To test how core2md errors are propagaged, cause an error
|
| // by forgetting a required argument.
|
| - core2md_arguments.pop_back();
|
| }
|
|
|
| - int errorlevel = ForkExecAndPipe(core2md_arguments,
|
| - output_path.value().c_str());
|
| + int errorlevel = core2md.Run();
|
|
|
| std::string output;
|
| file_util::ReadFileToString(output_path, &output);
|
| if (errorlevel != 0) {
|
| - logger_->LogError("Problem during %s [result=%d]: %s",
|
| - kCoreToMinidumpConverterPath,
|
| - errorlevel,
|
| - output.c_str());
|
| + LOG(ERROR) << "Problem during " << kCoreToMinidumpConverterPath
|
| + << " [result=" << errorlevel << "]: " << output;
|
| return false;
|
| }
|
|
|
| if (!file_util::PathExists(minidump_path)) {
|
| - logger_->LogError("Minidump file %s was not created",
|
| - minidump_path.value().c_str());
|
| + LOG(ERROR) << "Minidump file " << minidump_path.value()
|
| + << " was not created";
|
| return false;
|
| }
|
| return true;
|
| @@ -356,7 +351,7 @@ bool UserCollector::ConvertCoreToMinidump(pid_t pid,
|
| container_dir); // temporary directory
|
|
|
| if (conversion_result) {
|
| - logger_->LogInfo("Stored minidump to %s", minidump_path.value().c_str());
|
| + LOG(INFO) << "Stored minidump to " << minidump_path.value();
|
| }
|
|
|
| return conversion_result;
|
| @@ -367,7 +362,7 @@ bool UserCollector::ConvertAndEnqueueCrash(int pid,
|
| bool *out_of_capacity) {
|
| FilePath crash_path;
|
| if (!GetCreatedCrashDirectory(pid, &crash_path, out_of_capacity)) {
|
| - logger_->LogError("Unable to find/create process-specific crash path");
|
| + LOG(ERROR) << "Unable to find/create process-specific crash path";
|
| return false;
|
| }
|
|
|
| @@ -390,8 +385,8 @@ bool UserCollector::ConvertAndEnqueueCrash(int pid,
|
|
|
| if (!ConvertCoreToMinidump(pid, container_dir, core_path,
|
| minidump_path)) {
|
| - logger_->LogInfo("Leaving core file at %s due to conversion error",
|
| - core_path.value().c_str());
|
| + LOG(INFO) << "Leaving core file at " << core_path.value()
|
| + << " due to conversion error";
|
| return false;
|
| }
|
|
|
| @@ -405,8 +400,8 @@ bool UserCollector::ConvertAndEnqueueCrash(int pid,
|
| if (!file_util::PathExists(FilePath(kLeaveCoreFile))) {
|
| file_util::Delete(core_path, false);
|
| } else {
|
| - logger_->LogInfo("Leaving core file at %s due to developer image",
|
| - core_path.value().c_str());
|
| + LOG(INFO) << "Leaving core file at " << core_path.value()
|
| + << " due to developer image";
|
| }
|
|
|
| file_util::Delete(container_dir, true);
|
| @@ -429,7 +424,7 @@ bool UserCollector::HandleCrash(const std::string &crash_attributes,
|
|
|
| if (!ParseCrashAttributes(crash_attributes, &pid, &signal,
|
| &kernel_supplied_name)) {
|
| - logger_->LogError("Invalid parameter: --user=%s", crash_attributes.c_str());
|
| + LOG(ERROR) << "Invalid parameter: --user=" << crash_attributes;
|
| return false;
|
| }
|
|
|
| @@ -450,8 +445,8 @@ bool UserCollector::HandleCrash(const std::string &crash_attributes,
|
| FLAGS_filter_in != exec)) {
|
| // We use a different format message to make it more obvious in tests
|
| // which crashes are test generated and which are real.
|
| - logger_->LogWarning("Ignoring crash from %s[%d] while filter_in=%s.",
|
| - exec.c_str(), pid, FLAGS_filter_in.c_str());
|
| + LOG(WARNING) << "Ignoring crash from " << exec << "[" << pid << "] while "
|
| + << "filter_in=" << FLAGS_filter_in << ".";
|
| return true;
|
| }
|
|
|
| @@ -469,8 +464,8 @@ bool UserCollector::HandleCrash(const std::string &crash_attributes,
|
| handling_string = "ignoring - chrome crash";
|
| }
|
|
|
| - logger_->LogWarning("Received crash notification for %s[%d] sig %d (%s)",
|
| - exec.c_str(), pid, signal, handling_string);
|
| + LOG(WARNING) << "Received crash notification for " << exec << "[" << pid
|
| + << "] sig " << signal << " (" << handling_string << ")";
|
|
|
| if (feedback) {
|
| count_crash_function_();
|
|
|