| 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 "crash-reporter/crash_collector.h" | 5 #include "crash-reporter/crash_collector.h" |
| 6 | 6 |
| 7 #include <dirent.h> | 7 #include <dirent.h> |
| 8 #include <pwd.h> // For struct passwd. | 8 #include <pwd.h> // For struct passwd. |
| 9 #include <sys/types.h> // for mode_t. | 9 #include <sys/types.h> // for mode_t. |
| 10 | 10 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 // Maximum crash reports per crash spool directory. Note that this is | 32 // Maximum crash reports per crash spool directory. Note that this is |
| 33 // a separate maximum from the maximum rate at which we upload these | 33 // a separate maximum from the maximum rate at which we upload these |
| 34 // diagnostics. The higher this rate is, the more space we allow for | 34 // diagnostics. The higher this rate is, the more space we allow for |
| 35 // core files, minidumps, and kcrash logs, and equivalently the more | 35 // core files, minidumps, and kcrash logs, and equivalently the more |
| 36 // processor and I/O bandwidth we dedicate to handling these crashes when | 36 // processor and I/O bandwidth we dedicate to handling these crashes when |
| 37 // many occur at once. Also note that if core files are configured to | 37 // many occur at once. Also note that if core files are configured to |
| 38 // be left on the file system, we stop adding crashes when either the | 38 // be left on the file system, we stop adding crashes when either the |
| 39 // number of core files or minidumps reaches this number. | 39 // number of core files or minidumps reaches this number. |
| 40 const int CrashCollector::kMaxCrashDirectorySize = 32; | 40 const int CrashCollector::kMaxCrashDirectorySize = 32; |
| 41 | 41 |
| 42 CrashCollector::CrashCollector() : forced_crash_directory_(NULL) { | 42 CrashCollector::CrashCollector() |
| 43 : forced_crash_directory_(NULL), |
| 44 lsb_release_(kLsbRelease) { |
| 43 } | 45 } |
| 44 | 46 |
| 45 CrashCollector::~CrashCollector() { | 47 CrashCollector::~CrashCollector() { |
| 46 } | 48 } |
| 47 | 49 |
| 48 void CrashCollector::Initialize( | 50 void CrashCollector::Initialize( |
| 49 CrashCollector::CountCrashFunction count_crash_function, | 51 CrashCollector::CountCrashFunction count_crash_function, |
| 50 CrashCollector::IsFeedbackAllowedFunction is_feedback_allowed_function, | 52 CrashCollector::IsFeedbackAllowedFunction is_feedback_allowed_function, |
| 51 SystemLogging *logger) { | 53 SystemLogging *logger) { |
| 52 CHECK(count_crash_function != NULL); | 54 CHECK(count_crash_function != NULL); |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 SplitString(*line, separator, &sides); | 242 SplitString(*line, separator, &sides); |
| 241 if (sides.size() != 2) { | 243 if (sides.size() != 2) { |
| 242 any_errors = true; | 244 any_errors = true; |
| 243 continue; | 245 continue; |
| 244 } | 246 } |
| 245 dictionary->insert(std::pair<std::string, std::string>(sides[0], sides[1])); | 247 dictionary->insert(std::pair<std::string, std::string>(sides[0], sides[1])); |
| 246 } | 248 } |
| 247 return !any_errors; | 249 return !any_errors; |
| 248 } | 250 } |
| 249 | 251 |
| 252 void CrashCollector::AddCrashMetaData(const std::string &key, |
| 253 const std::string &value) { |
| 254 extra_metadata_.append(StringPrintf("%s=%s\n", key.c_str(), value.c_str())); |
| 255 } |
| 256 |
| 250 void CrashCollector::WriteCrashMetaData(const FilePath &meta_path, | 257 void CrashCollector::WriteCrashMetaData(const FilePath &meta_path, |
| 251 const std::string &exec_name, | 258 const std::string &exec_name, |
| 252 const std::string &payload_path) { | 259 const std::string &payload_path) { |
| 253 std::map<std::string, std::string> contents; | 260 std::map<std::string, std::string> contents; |
| 254 if (!ReadKeyValueFile(FilePath(std::string(kLsbRelease)), '=', &contents)) { | 261 if (!ReadKeyValueFile(FilePath(std::string(lsb_release_)), '=', &contents)) { |
| 255 logger_->LogError("Problem parsing %s", kLsbRelease); | 262 logger_->LogError("Problem parsing %s", lsb_release_); |
| 256 // Even though there was some failure, take as much as we could read. | 263 // Even though there was some failure, take as much as we could read. |
| 257 } | 264 } |
| 258 std::string version("unknown"); | 265 std::string version("unknown"); |
| 259 std::map<std::string, std::string>::iterator i; | 266 std::map<std::string, std::string>::iterator i; |
| 260 if ((i = contents.find("CHROMEOS_RELEASE_VERSION")) != contents.end()) { | 267 if ((i = contents.find("CHROMEOS_RELEASE_VERSION")) != contents.end()) { |
| 261 version = i->second; | 268 version = i->second; |
| 262 } | 269 } |
| 263 int64 payload_size = -1; | 270 int64 payload_size = -1; |
| 264 file_util::GetFileSize(FilePath(payload_path), &payload_size); | 271 file_util::GetFileSize(FilePath(payload_path), &payload_size); |
| 265 std::string meta_data = StringPrintf("exec_name=%s\n" | 272 std::string meta_data = StringPrintf("%sexec_name=%s\n" |
| 266 "ver=%s\n" | 273 "ver=%s\n" |
| 267 "payload_size=%lld\n" | 274 "payload_size=%lld\n" |
| 268 "done=1\n", | 275 "done=1\n", |
| 276 extra_metadata_.c_str(), |
| 269 exec_name.c_str(), | 277 exec_name.c_str(), |
| 270 version.c_str(), | 278 version.c_str(), |
| 271 payload_size); | 279 payload_size); |
| 272 if (!file_util::WriteFile(meta_path, meta_data.c_str(), meta_data.size())) { | 280 if (!file_util::WriteFile(meta_path, meta_data.c_str(), meta_data.size())) { |
| 273 logger_->LogError("Unable to write %s", meta_path.value().c_str()); | 281 logger_->LogError("Unable to write %s", meta_path.value().c_str()); |
| 274 } | 282 } |
| 275 } | 283 } |
| OLD | NEW |