Chromium Code Reviews| Index: crash_reporter.cc |
| diff --git a/crash_reporter.cc b/crash_reporter.cc |
| index ab4c5ba3bfe6a8bd590346260ba0c401021743ea..1f2e94a52955bf091c110fcb39ac093a23195ba8 100644 |
| --- a/crash_reporter.cc |
| +++ b/crash_reporter.cc |
| @@ -2,14 +2,16 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| +#include <fcntl.h> // for open |
| + |
| #include <string> |
| #include "base/file_util.h" |
| #include "base/command_line.h" |
| #include "base/logging.h" |
| #include "base/string_util.h" |
| +#include "chromeos/syslog_logging.h" |
| #include "crash-reporter/kernel_collector.h" |
| -#include "crash-reporter/system_logging.h" |
| #include "crash-reporter/unclean_shutdown_collector.h" |
| #include "crash-reporter/user_collector.h" |
| #include "gflags/gflags.h" |
| @@ -41,7 +43,6 @@ enum CrashKinds { |
| }; |
| static MetricsLibrary s_metrics_lib; |
| -static SystemLoggingImpl s_system_log; |
| static bool IsFeedbackAllowed() { |
| return s_metrics_lib.AreMetricsEnabled(); |
| @@ -96,9 +97,7 @@ static void CountUserCrash() { |
| // to be restarted anyway. |
| int status = system(command.c_str()); |
| - if (status != 0) { |
| - s_system_log.LogWarning("dbus-send running failed"); |
| - } |
| + LOG_IF(WARNING, status != 0) << "dbus-send running failed"; |
| } |
| static int Initialize(KernelCollector *kernel_collector, |
| @@ -149,10 +148,10 @@ static int HandleUserCrash(UserCollector *user_collector) { |
| } |
| // Accumulate logs to help in diagnosing failures during user collection. |
| - s_system_log.set_accumulating(true); |
| + chromeos::LogToString(true); |
| // Handle the crash, get the name of the process from procfs. |
| bool handled = user_collector->HandleCrash(FLAGS_user, NULL); |
| - s_system_log.set_accumulating(false); |
| + chromeos::LogToString(false); |
| if (!handled) |
| return 1; |
| return 0; |
| @@ -178,31 +177,41 @@ static int GenerateKernelSignature(KernelCollector *kernel_collector) { |
| return 0; |
| } |
| +// Ensure stdout, stdin, and stderr are open file descriptors. If |
| +// they are not, any code which writes to stderr/stdout may write out |
| +// to files opened during execution. In particular, when |
| +// crash_reporter is run by the kernel coredump pipe handler (via |
| +// kthread_create/kernel_execve), it will not have file table entries |
| +// 1 and 2 (stdout and stderr). |
| +static void OpenStandardFileDescriptors() { |
| + int new_fd = -1; |
| + do { |
| + new_fd = open("/dev/null", 0); |
| + CHECK(new_fd >= 0) << "Unable to open /dev/null"; |
| + } while (new_fd >= 0 && new_fd <= 2); |
| + close(new_fd); |
|
petkov
2011/03/02 17:53:20
how does this work? don't you need to close inside
kmixter1
2011/03/02 19:08:58
Does the comment make sense now?
|
| +} |
| + |
| int main(int argc, char *argv[]) { |
| + OpenStandardFileDescriptors(); |
| google::ParseCommandLineFlags(&argc, &argv, true); |
| FilePath my_path(argv[0]); |
| file_util::AbsolutePath(&my_path); |
| s_metrics_lib.Init(); |
| CommandLine::Init(argc, argv); |
| - logging::InitLogging(NULL, |
| - logging::LOG_ONLY_TO_SYSTEM_DEBUG_LOG, |
| - logging::DONT_LOCK_LOG_FILE, |
| - logging::DELETE_OLD_LOG_FILE); |
| - s_system_log.Initialize(my_path.BaseName().value().c_str()); |
| + chromeos::OpenLog(my_path.BaseName().value().c_str(), true); |
| + chromeos::InitLog(chromeos::kLogToSyslog); |
| KernelCollector kernel_collector; |
| kernel_collector.Initialize(CountKernelCrash, |
| - IsFeedbackAllowed, |
| - &s_system_log); |
| + IsFeedbackAllowed); |
| UserCollector user_collector; |
| user_collector.Initialize(CountUserCrash, |
| my_path.value(), |
| IsFeedbackAllowed, |
| - &s_system_log, |
| true); // generate_diagnostics |
| UncleanShutdownCollector unclean_shutdown_collector; |
| unclean_shutdown_collector.Initialize(CountUncleanShutdown, |
| - IsFeedbackAllowed, |
| - &s_system_log); |
| + IsFeedbackAllowed); |
| if (FLAGS_init) { |
| return Initialize(&kernel_collector, |