Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1251)

Unified Diff: components/browser_watcher/crash_reporting_metrics_win.cc

Issue 1922473003: Scrub the vestigal breakpad crash dump attempts metrics code. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address Greg's comments. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/browser_watcher/crash_reporting_metrics_win.cc
diff --git a/components/browser_watcher/crash_reporting_metrics_win.cc b/components/browser_watcher/crash_reporting_metrics_win.cc
deleted file mode 100644
index 7c4dd84198f26dbea429804d11cef28f252b95c9..0000000000000000000000000000000000000000
--- a/components/browser_watcher/crash_reporting_metrics_win.cc
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright 2015 The Chromium 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 "components/browser_watcher/crash_reporting_metrics_win.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-#include "base/atomicops.h"
-#include "base/guid.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/strings/safe_sprintf.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/win/registry.h"
-
-namespace browser_watcher {
-
-namespace {
-
-// The prior implementation used 0 and 1. Its data collection is inconsistent
-// with ours and it's best to just ignore its records. So we start at 2.
-const DWORD kCrashDumpAttempt = 2;
-const DWORD kDumpWithoutCrashAttempt = 3;
-const DWORD kCrashDumpSuccess = 4;
-const DWORD kCrashDumpFailure = 5;
-const DWORD kDumpWithoutCrashSuccess = 6;
-const DWORD kDumpWithoutCrashFailure = 7;
-
-// A prefix intended to avoid registry value name collisions with other
-// processes (or modules within a single process). It is not necessary for the
-// reading and writing instances to share the prefix value. This array is sized
-// to hold a null-terminated string as generated by base::GenerateGUID.
-char g_unique_prefix[36 + 1] = {0};
-
-// An atomic counter intended to make each registry value name unique within
-// this process and module.
-base::subtle::Atomic32 g_record_count = 0;
-
-// The length of a null-terminated string consisting of "{GUID}-{COUNT}".
-const size_t kValueNameSize = 36 + 1 + 8 + 1;
-
-void WriteValue(const base::string16& key_path, DWORD value) {
- // Generate the final value name we'll use (appends the crash number to the
- // base value name).
- char value_name_ascii[kValueNameSize] = "";
- base::char16 value_name_utf16[kValueNameSize] = L"";
-
- if (base::strings::SafeSPrintf(
- value_name_ascii, "%s-%x", g_unique_prefix,
- base::subtle::NoBarrier_AtomicIncrement(&g_record_count, 1)) <= 0) {
- NOTREACHED();
- } else {
- // Since it's an ASCII string, the UTF-16 form is identical with leading 0
- // bytes. We're avoiding unnecessary heap operations since we're running in
- // a compromised process.
- std::copy(value_name_ascii, value_name_ascii + kValueNameSize,
- value_name_utf16);
-
- base::win::RegKey reg_key;
- if (reg_key.Create(HKEY_CURRENT_USER, key_path.c_str(), KEY_SET_VALUE) !=
- ERROR_SUCCESS) {
- NOTREACHED();
- } else {
- reg_key.WriteValue(value_name_utf16, value);
- }
- }
-
-}
-
-} // namespace
-
-CrashReportingMetrics::CrashReportingMetrics(
- const base::string16& registry_path)
- : registry_path_(registry_path) {
- if (g_unique_prefix[0] == 0) {
- std::string guid = base::GenerateGUID();
- // It seems reasonable to assume that the worst possible outcome of two
- // separate threads trying to do the following would be to store a GUID
- // value that is a hybrid of the two intended values. Hence we can avoid any
- // thread-safety caveats in our public API.
- size_t copied_size = base::strlcpy(g_unique_prefix, guid.c_str(),
- arraysize(g_unique_prefix));
- DCHECK_EQ(copied_size, guid.length());
- }
-}
-
-void CrashReportingMetrics::RecordCrashDumpAttempt() {
- WriteValue(registry_path_, kCrashDumpAttempt);
-}
-
-void CrashReportingMetrics::RecordDumpWithoutCrashAttempt() {
- WriteValue(registry_path_, kDumpWithoutCrashAttempt);
-}
-void CrashReportingMetrics::RecordCrashDumpAttemptResult(bool succeeded) {
- WriteValue(registry_path_, succeeded ? kCrashDumpSuccess : kCrashDumpFailure);
-}
-void CrashReportingMetrics::RecordDumpWithoutCrashAttemptResult(
- bool succeeded) {
- WriteValue(registry_path_,
- succeeded ? kDumpWithoutCrashSuccess : kDumpWithoutCrashFailure);
-}
-
-CrashReportingMetrics::Values CrashReportingMetrics::RetrieveAndResetMetrics() {
- Values values = {0};
-
- // Open the registry key for iteration.
- base::win::RegKey regkey;
- if (regkey.Open(HKEY_CURRENT_USER, registry_path_.c_str(),
- KEY_QUERY_VALUE | KEY_SET_VALUE) != ERROR_SUCCESS) {
- return values;
- }
-
- // Track a list of values to delete. We don't modify the registry key while
- // we're iterating over its values.
- typedef std::vector<base::string16> StringVector;
- StringVector to_delete;
-
- // Iterate over the values in the key counting dumps with and without crashes.
- // We directly walk the values instead of using RegistryValueIterator in order
- // to read all of the values as DWORDS instead of strings.
- base::string16 name;
- DWORD value = 0;
- for (int i = regkey.GetValueCount() - 1; i >= 0; --i) {
- if (regkey.GetValueNameAt(i, &name) == ERROR_SUCCESS &&
- regkey.ReadValueDW(name.c_str(), &value) == ERROR_SUCCESS) {
- to_delete.push_back(name);
- switch (value) {
- case kCrashDumpAttempt:
- ++values.crash_dump_attempts;
- break;
- case kCrashDumpSuccess:
- ++values.successful_crash_dumps;
- break;
- case kCrashDumpFailure:
- ++values.failed_crash_dumps;
- break;
- case kDumpWithoutCrashAttempt:
- ++values.dump_without_crash_attempts;
- break;
- case kDumpWithoutCrashSuccess:
- ++values.successful_dumps_without_crash;
- break;
- case kDumpWithoutCrashFailure:
- ++values.failed_dumps_without_crash;
- break;
- default:
- // Presumably a pre-existing record from the previous implementation.
- // We will delete it.
- break;
- }
- }
- }
-
- // Delete the registry keys we've just counted.
- for (const auto& value_name : to_delete)
- regkey.DeleteValue(value_name.c_str());
-
- return values;
-}
-
-} // namespace browser_watcher

Powered by Google App Engine
This is Rietveld 408576698