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_(); |