| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "crash/system_logging.h" | 10 #include "crash/system_logging.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 static const char kUncleanShutdownFile[] = | 23 static const char kUncleanShutdownFile[] = |
| 24 "/var/lib/crash_reporter/pending_clean_shutdown"; | 24 "/var/lib/crash_reporter/pending_clean_shutdown"; |
| 25 | 25 |
| 26 // Enumeration of kinds of crashes to be used in the CrashCounter histogram. | 26 // Enumeration of kinds of crashes to be used in the CrashCounter histogram. |
| 27 enum CrashKinds { | 27 enum CrashKinds { |
| 28 CRASH_KIND_KERNEL = 1, | 28 CRASH_KIND_KERNEL = 1, |
| 29 CRASH_KIND_USER = 2, | 29 CRASH_KIND_USER = 2, |
| 30 CRASH_KIND_MAX | 30 CRASH_KIND_MAX |
| 31 }; | 31 }; |
| 32 | 32 |
| 33 static MetricsLibrary s_metrics_lib; |
| 33 static SystemLoggingImpl s_system_log; | 34 static SystemLoggingImpl s_system_log; |
| 34 | 35 |
| 35 static bool IsMetricsCollectionAllowed() { | 36 static bool IsMetricsCollectionAllowed() { |
| 36 // TODO(kmixter): Eventually check system tainted state and | 37 // TODO(kmixter): Eventually check system tainted state and |
| 37 // move this down in metrics library where it would be explicitly | 38 // move this down in metrics library where it would be explicitly |
| 38 // checked when asked to send stats. | 39 // checked when asked to send stats. |
| 39 return true; | 40 return true; |
| 40 } | 41 } |
| 41 | 42 |
| 42 static void CheckUncleanShutdown() { | 43 static void CheckUncleanShutdown() { |
| 43 FilePath unclean_file_path(kUncleanShutdownFile); | 44 FilePath unclean_file_path(kUncleanShutdownFile); |
| 44 if (!file_util::PathExists(unclean_file_path)) { | 45 if (!file_util::PathExists(unclean_file_path)) { |
| 45 return; | 46 return; |
| 46 } | 47 } |
| 47 s_system_log.LogWarning("Last shutdown was not clean"); | 48 s_system_log.LogWarning("Last shutdown was not clean"); |
| 48 if (IsMetricsCollectionAllowed()) { | 49 if (IsMetricsCollectionAllowed()) { |
| 49 MetricsLibrary::SendEnumToChrome(std::string(kCrashCounterHistogram), | 50 s_metrics_lib.SendEnumToUMA(std::string(kCrashCounterHistogram), |
| 50 CRASH_KIND_KERNEL, | 51 CRASH_KIND_KERNEL, |
| 51 CRASH_KIND_MAX); | 52 CRASH_KIND_MAX); |
| 52 } | 53 } |
| 53 if (!file_util::Delete(unclean_file_path, false)) { | 54 if (!file_util::Delete(unclean_file_path, false)) { |
| 54 s_system_log.LogError("Failed to delete unclean shutdown file %s", | 55 s_system_log.LogError("Failed to delete unclean shutdown file %s", |
| 55 kUncleanShutdownFile); | 56 kUncleanShutdownFile); |
| 56 } | 57 } |
| 57 } | 58 } |
| 58 | 59 |
| 59 static bool PrepareUncleanShutdownCheck() { | 60 static bool PrepareUncleanShutdownCheck() { |
| 60 static const char empty[] = ""; | 61 static const char empty[] = ""; |
| 61 FilePath file_path(kUncleanShutdownFile); | 62 FilePath file_path(kUncleanShutdownFile); |
| 62 file_util::CreateDirectory(file_path.DirName()); | 63 file_util::CreateDirectory(file_path.DirName()); |
| 63 return file_util::WriteFile(file_path, empty, 0) == 0; | 64 return file_util::WriteFile(file_path, empty, 0) == 0; |
| 64 } | 65 } |
| 65 | 66 |
| 66 static void SignalCleanShutdown() { | 67 static void SignalCleanShutdown() { |
| 67 s_system_log.LogInfo("Clean shutdown signalled"); | 68 s_system_log.LogInfo("Clean shutdown signalled"); |
| 68 file_util::Delete(FilePath(kUncleanShutdownFile), false); | 69 file_util::Delete(FilePath(kUncleanShutdownFile), false); |
| 69 } | 70 } |
| 70 | 71 |
| 71 static void CountUserCrash() { | 72 static void CountUserCrash() { |
| 72 CHECK(IsMetricsCollectionAllowed()); | 73 CHECK(IsMetricsCollectionAllowed()); |
| 73 MetricsLibrary::SendEnumToChrome(std::string(kCrashCounterHistogram), | 74 s_metrics_lib.SendEnumToUMA(std::string(kCrashCounterHistogram), |
| 74 CRASH_KIND_USER, | 75 CRASH_KIND_USER, |
| 75 CRASH_KIND_MAX); | 76 CRASH_KIND_MAX); |
| 76 } | 77 } |
| 77 | 78 |
| 78 int main(int argc, char *argv[]) { | 79 int main(int argc, char *argv[]) { |
| 79 google::ParseCommandLineFlags(&argc, &argv, true); | 80 google::ParseCommandLineFlags(&argc, &argv, true); |
| 80 FilePath my_path(argv[0]); | 81 FilePath my_path(argv[0]); |
| 81 file_util::AbsolutePath(&my_path); | 82 file_util::AbsolutePath(&my_path); |
| 83 s_metrics_lib.Init(); |
| 82 s_system_log.Initialize(my_path.BaseName().value().c_str()); | 84 s_system_log.Initialize(my_path.BaseName().value().c_str()); |
| 83 UserCollector user_collector; | 85 UserCollector user_collector; |
| 84 user_collector.Initialize(CountUserCrash, | 86 user_collector.Initialize(CountUserCrash, |
| 85 my_path.value(), | 87 my_path.value(), |
| 86 IsMetricsCollectionAllowed, | 88 IsMetricsCollectionAllowed, |
| 87 &s_system_log); | 89 &s_system_log); |
| 88 | 90 |
| 89 if (FLAGS_init) { | 91 if (FLAGS_init) { |
| 90 CHECK(!FLAGS_clean_shutdown) << "Incompatible options"; | 92 CHECK(!FLAGS_clean_shutdown) << "Incompatible options"; |
| 91 user_collector.Enable(); | 93 user_collector.Enable(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 106 | 108 |
| 107 // Handle a specific user space crash. | 109 // Handle a specific user space crash. |
| 108 CHECK(FLAGS_signal != -1) << "Signal must be set"; | 110 CHECK(FLAGS_signal != -1) << "Signal must be set"; |
| 109 CHECK(FLAGS_pid != -1) << "PID must be set"; | 111 CHECK(FLAGS_pid != -1) << "PID must be set"; |
| 110 CHECK(FLAGS_exec != "") << "Executable name must be set"; | 112 CHECK(FLAGS_exec != "") << "Executable name must be set"; |
| 111 | 113 |
| 112 user_collector.HandleCrash(FLAGS_signal, FLAGS_pid, FLAGS_exec); | 114 user_collector.HandleCrash(FLAGS_signal, FLAGS_pid, FLAGS_exec); |
| 113 | 115 |
| 114 return 0; | 116 return 0; |
| 115 } | 117 } |
| OLD | NEW |