Chromium Code Reviews| Index: third_party/crashpad/crashpad/handler/handler_main.cc |
| diff --git a/third_party/crashpad/crashpad/handler/handler_main.cc b/third_party/crashpad/crashpad/handler/handler_main.cc |
| index 3240cd38b37d79d6c915560aa41f325702cf00cd..ccade4b6b56336c8403020bfcb0cd2f29c862092 100644 |
| --- a/third_party/crashpad/crashpad/handler/handler_main.cc |
| +++ b/third_party/crashpad/crashpad/handler/handler_main.cc |
| @@ -25,8 +25,10 @@ |
| #include "base/auto_reset.h" |
| #include "base/files/file_path.h" |
| +#include "base/files/file_util.h" |
| #include "base/files/scoped_file.h" |
| #include "base/logging.h" |
| +#include "base/metrics/persistent_histogram_allocator.h" |
| #include "base/scoped_generic.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "build/build_config.h" |
| @@ -118,6 +120,47 @@ void HandleSIGTERM(int sig, siginfo_t* siginfo, void* context) { |
| #endif // OS_MACOSX |
| +// This is used as both the file name and the "allocator" name, which is an |
| +// internal histograms concept. |
| +const char kMetricsName[] = "CrashpadMetrics"; |
| +const base::FilePath::CharType kMetricsFileExtension[] = |
| + FILE_PATH_LITERAL(".pma"); |
| + |
| +void InitializePersistentMetricsStorage(const char* database_dir) { |
| + const base::FilePath dir( |
| + ToolSupport::CommandLineArgumentToFilePathStringType(database_dir)); |
| + |
| + // Metrics maps one file that we're going to use during this run (the |
| + // "-active" one), and provides the previous one to the metrics system for for |
| + // association with the previous run. On startup, we move the current -active |
| + // to the base name, and then start this session on the -active one. Normally, |
| + // when the browser starts it will read and delete the base name one, but in |
| + // the case that something goes wrong, we will overwrite/delete any old one. |
| + base::FilePath metrics_file = |
| + dir.AppendASCII(kMetricsName).AddExtension(kMetricsFileExtension); |
| + base::FilePath active_file = |
| + dir.AppendASCII(kMetricsName + std::string("-active")) |
| + .AddExtension(kMetricsFileExtension); |
| + |
| + if (!base::ReplaceFile(active_file, metrics_file, nullptr)) |
| + base::DeleteFile(metrics_file, /*recursive=*/false); |
| + |
| + const size_t kSize = 1 << 20; |
| + base::GlobalHistogramAllocator::CreateWithFile( |
|
bcwhite
2016/09/13 14:27:48
This file needs to be deleted when the browser exi
scottmg
2016/09/13 19:15:32
Ah, I didn't understand the reporting model. So on
bcwhite
2016/09/13 19:38:24
The model you've selected is that "CrashpadMetrics
|
| + active_file, kSize, 0, kMetricsName); |
| + |
| + // Get the allocator that was just created and report result. Exit if the |
| + // allocator could not be created. |
| + base::GlobalHistogramAllocator* allocator = |
| + base::GlobalHistogramAllocator::Get(); |
| + if (!allocator) |
| + return; |
| + |
| + // Create tracking histograms for the allocator and record storage file. |
| + allocator->CreateTrackingHistograms(kMetricsName); |
| + allocator->SetPersistentLocation(active_file); |
| +} |
| + |
| } // namespace |
| int HandlerMain(int argc, char* argv[]) { |
| @@ -313,6 +356,15 @@ int HandlerMain(int argc, char* argv[]) { |
| return EXIT_FAILURE; |
| } |
| + std::unique_ptr<CrashReportDatabase> database(CrashReportDatabase::Initialize( |
|
scottmg
2016/09/02 19:33:54
This is moved earlier so that the database directo
|
| + base::FilePath(ToolSupport::CommandLineArgumentToFilePathStringType( |
| + options.database)))); |
| + if (!database) { |
| + return EXIT_FAILURE; |
| + } |
| + |
| + InitializePersistentMetricsStorage(options.database); |
| + |
| #if defined(OS_MACOSX) |
| if (options.mach_service.empty()) { |
| // Don’t do this when being run by launchd. See launchd.plist(5). |
| @@ -386,13 +438,6 @@ int HandlerMain(int argc, char* argv[]) { |
| } |
| #endif // OS_MACOSX |
| - std::unique_ptr<CrashReportDatabase> database(CrashReportDatabase::Initialize( |
| - base::FilePath(ToolSupport::CommandLineArgumentToFilePathStringType( |
| - options.database)))); |
| - if (!database) { |
| - return EXIT_FAILURE; |
| - } |
| - |
| // TODO(scottmg): options.rate_limit should be removed when we have a |
| // configurable database setting to control upload limiting. |
| // See https://crashpad.chromium.org/bug/23. |