Index: crash_reporter.cc |
diff --git a/crash_reporter.cc b/crash_reporter.cc |
deleted file mode 100644 |
index e283322dab15b1c2c1640866755bd6bf5f7fe182..0000000000000000000000000000000000000000 |
--- a/crash_reporter.cc |
+++ /dev/null |
@@ -1,139 +0,0 @@ |
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <string> |
- |
-#include "base/file_util.h" |
-#include "base/logging.h" |
-#include "base/string_util.h" |
-#include "crash/system_logging.h" |
-#include "crash/user_collector.h" |
-#include "gflags/gflags.h" |
-#include "metrics/metrics_library.h" |
- |
-#pragma GCC diagnostic ignored "-Wstrict-aliasing" |
-DEFINE_bool(init, false, "Initialize crash logging"); |
-DEFINE_bool(clean_shutdown, false, "Signal clean shutdown"); |
-DEFINE_bool(crash_test, false, "Crash test"); |
-DEFINE_string(exec, "", "Executable name crashed"); |
-DEFINE_int32(pid, -1, "Crashing PID"); |
-DEFINE_int32(signal, -1, "Signal causing crash"); |
-DEFINE_bool(unclean_check, true, "Check for unclean shutdown"); |
-#pragma GCC diagnostic error "-Wstrict-aliasing" |
- |
-static const char kCrashCounterHistogram[] = "Logging.CrashCounter"; |
-static const char kUncleanShutdownFile[] = |
- "/var/lib/crash_reporter/pending_clean_shutdown"; |
- |
-// Enumeration of kinds of crashes to be used in the CrashCounter histogram. |
-enum CrashKinds { |
- CRASH_KIND_KERNEL = 1, |
- CRASH_KIND_USER = 2, |
- CRASH_KIND_MAX |
-}; |
- |
-static MetricsLibrary s_metrics_lib; |
-static SystemLoggingImpl s_system_log; |
- |
-static bool IsMetricsCollectionAllowed() { |
- // TODO(kmixter): Eventually check system tainted state and |
- // move this down in metrics library where it would be explicitly |
- // checked when asked to send stats. |
- return true; |
-} |
- |
-static void CheckUncleanShutdown() { |
- FilePath unclean_file_path(kUncleanShutdownFile); |
- if (!file_util::PathExists(unclean_file_path)) { |
- return; |
- } |
- s_system_log.LogWarning("Last shutdown was not clean"); |
- if (IsMetricsCollectionAllowed()) { |
- s_metrics_lib.SendEnumToUMA(std::string(kCrashCounterHistogram), |
- CRASH_KIND_KERNEL, |
- CRASH_KIND_MAX); |
- } |
- if (!file_util::Delete(unclean_file_path, false)) { |
- s_system_log.LogError("Failed to delete unclean shutdown file %s", |
- kUncleanShutdownFile); |
- } |
-} |
- |
-static bool PrepareUncleanShutdownCheck() { |
- static const char empty[] = ""; |
- FilePath file_path(kUncleanShutdownFile); |
- file_util::CreateDirectory(file_path.DirName()); |
- return file_util::WriteFile(file_path, empty, 0) == 0; |
-} |
- |
-static void SignalCleanShutdown() { |
- s_system_log.LogInfo("Clean shutdown signalled"); |
- file_util::Delete(FilePath(kUncleanShutdownFile), false); |
-} |
- |
-static void CountUserCrash() { |
- CHECK(IsMetricsCollectionAllowed()); |
- s_metrics_lib.SendEnumToUMA(std::string(kCrashCounterHistogram), |
- CRASH_KIND_USER, |
- CRASH_KIND_MAX); |
- |
- // Announce through D-Bus whenever a user crash happens. This is |
- // used by the metrics daemon to log active use time between |
- // crashes. |
- // |
- // This could be done more efficiently by explicit fork/exec or |
- // using a dbus library directly. However, this should run |
- // relatively rarely and longer term we may need to implement a |
- // better way to do this that doesn't rely on D-Bus. |
- int status __attribute__((unused)) = |
- system("/usr/bin/dbus-send --type=signal --system / " |
- "org.chromium.CrashReporter.UserCrash"); |
-} |
- |
-int main(int argc, char *argv[]) { |
- google::ParseCommandLineFlags(&argc, &argv, true); |
- FilePath my_path(argv[0]); |
- file_util::AbsolutePath(&my_path); |
- s_metrics_lib.Init(); |
- s_system_log.Initialize(my_path.BaseName().value().c_str()); |
- UserCollector user_collector; |
- user_collector.Initialize(CountUserCrash, |
- my_path.value(), |
- IsMetricsCollectionAllowed, |
- &s_system_log); |
- |
- if (FLAGS_init) { |
- CHECK(!FLAGS_clean_shutdown) << "Incompatible options"; |
- user_collector.Enable(); |
- if (FLAGS_unclean_check) { |
- CheckUncleanShutdown(); |
- if (!PrepareUncleanShutdownCheck()) { |
- s_system_log.LogError("Unable to create shutdown check file"); |
- } |
- } |
- return 0; |
- } |
- |
- if (FLAGS_clean_shutdown) { |
- SignalCleanShutdown(); |
- user_collector.Disable(); |
- return 0; |
- } |
- |
- // Handle a specific user space crash. |
- CHECK(FLAGS_signal != -1) << "Signal must be set"; |
- CHECK(FLAGS_pid != -1) << "PID must be set"; |
- CHECK(FLAGS_exec != "") << "Executable name must be set"; |
- |
- // Make it possible to test what happens when we crash while |
- // handling a crash. |
- if (FLAGS_crash_test) { |
- *(char *)0 = 0; |
- return 0; |
- } |
- |
- user_collector.HandleCrash(FLAGS_signal, FLAGS_pid, FLAGS_exec); |
- |
- return 0; |
-} |