Index: chrome/app/chrome_crash_reporter_client_win.cc |
diff --git a/chrome/app/chrome_crash_reporter_client_win.cc b/chrome/app/chrome_crash_reporter_client_win.cc |
index 6cd77d62cb9bd13497d0ffc52ee761cc416d05ce..42e2093efa73d2506a45a87d0b89b2b4cc974dc0 100644 |
--- a/chrome/app/chrome_crash_reporter_client_win.cc |
+++ b/chrome/app/chrome_crash_reporter_client_win.cc |
@@ -8,19 +8,199 @@ |
#include <assert.h> |
#include <windows.h> |
- |
+#include <shellapi.h> |
#include <memory> |
#include <string> |
-#include "build/build_config.h" |
+#include "base/command_line.h" |
+#include "base/debug/crash_logging.h" |
+#include "base/debug/leak_annotations.h" |
+#include "base/format_macros.h" |
#include "chrome/common/chrome_result_codes.h" |
-#include "chrome/common/crash_keys.h" |
#include "chrome/install_static/install_util.h" |
+#include "components/crash/content/app/crashpad.h" |
+#include "components/crash/core/common/crash_keys.h" |
+ |
+namespace { |
+ |
+// TODO(ananta) |
+// When the new crash key map implementation lands, we should remove the |
+// constants defined below, the RegisterCrashKeysHelper function, the |
+// RegisterCrashKeys function in the crash_keys::CrashReporterClient interface |
+// and the snprintf function defined here. |
+constexpr char kActiveURL[] = "url-chunk"; |
+constexpr char kFontKeyName[] = "font_key_name"; |
+ |
+// Installed extensions. |kExtensionID| should be formatted with an integer, |
+// in the range [0, kExtensionIDMaxCount). |
+constexpr char kNumExtensionsCount[] = "num-extensions"; |
+constexpr size_t kExtensionIDMaxCount = 10; |
+constexpr char kExtensionID[] = "extension-%" PRIuS; |
+ |
+constexpr char kShutdownType[] = "shutdown-type"; |
+ |
+constexpr char kGPUVendorID[] = "gpu-venid"; |
+constexpr char kGPUDeviceID[] = "gpu-devid"; |
+constexpr char kGPUDriverVersion[] = "gpu-driver"; |
+constexpr char kGPUPixelShaderVersion[] = "gpu-psver"; |
+constexpr char kGPUVertexShaderVersion[] = "gpu-vsver"; |
+ |
+constexpr char kHungAudioThreadDetails[] = "hung-audio-thread-details"; |
+ |
+constexpr char kViewCount[] = "view-count"; |
+constexpr char kZeroEncodeDetails[] = "zero-encode-details"; |
+ |
+// The user's printers, up to kPrinterInfoCount. Should be set with |
+// ScopedPrinterInfo. |
+constexpr size_t kPrinterInfoCount = 4; |
+constexpr char kPrinterInfo[] = "prn-info-%" PRIuS; |
+ |
+using namespace crash_keys; |
+ |
+int snprintf(char* buffer, |
+ size_t size, |
+ _Printf_format_string_ const char* format, |
+ ...) { |
+ va_list arguments; |
+ va_start(arguments, format); |
+ int result = vsnprintf(buffer, size, format, arguments); |
+ va_end(arguments); |
+ return result; |
+} |
+ |
+size_t RegisterCrashKeysHelper() { |
+ // The following keys may be chunked by the underlying crash logging system, |
+ // but ultimately constitute a single key-value pair. |
+ // |
+ // If you're adding keys here, please also add them to the list in |
+ // //blimp/engine/app/blimp_engine_crash_keys.cc |
+ constexpr base::debug::CrashKey fixed_keys[] = { |
+ {kMetricsClientId, kSmallSize}, |
+ {kChannel, kSmallSize}, |
+ {kActiveURL, kLargeSize}, |
+ {kNumVariations, kSmallSize}, |
+ {kVariations, kLargeSize}, |
+ {kNumExtensionsCount, kSmallSize}, |
+ {kShutdownType, kSmallSize}, |
+ {kGPUVendorID, kSmallSize}, |
+ {kGPUDeviceID, kSmallSize}, |
+ {kGPUDriverVersion, kSmallSize}, |
+ {kGPUPixelShaderVersion, kSmallSize}, |
+ {kGPUVertexShaderVersion, kSmallSize}, |
+ |
+ // content/: |
+ {"discardable-memory-allocated", kSmallSize}, |
+ {"discardable-memory-free", kSmallSize}, |
+ {kFontKeyName, kSmallSize}, |
+ {"ppapi_path", kMediumSize}, |
+ {"subresource_url", kLargeSize}, |
+ {"total-discardable-memory-allocated", kSmallSize}, |
+ {kBug464926CrashKey, kSmallSize}, |
+ {kViewCount, kSmallSize}, |
+ |
+ // media/: |
+ {kHungAudioThreadDetails, kSmallSize}, |
+ {kZeroEncodeDetails, kSmallSize}, |
+ |
+ // Temporary for http://crbug.com/575245. |
+ {"swapout_frame_id", kSmallSize}, |
+ {"swapout_proxy_id", kSmallSize}, |
+ {"swapout_view_id", kSmallSize}, |
+ {"commit_frame_id", kSmallSize}, |
+ {"commit_proxy_id", kSmallSize}, |
+ {"commit_view_id", kSmallSize}, |
+ {"commit_main_render_frame_id", kSmallSize}, |
+ {"newproxy_proxy_id", kSmallSize}, |
+ {"newproxy_view_id", kSmallSize}, |
+ {"newproxy_opener_id", kSmallSize}, |
+ {"newproxy_parent_id", kSmallSize}, |
+ {"rvinit_view_id", kSmallSize}, |
+ {"rvinit_proxy_id", kSmallSize}, |
+ {"rvinit_main_frame_id", kSmallSize}, |
+ {"initrf_frame_id", kSmallSize}, |
+ {"initrf_proxy_id", kSmallSize}, |
+ {"initrf_view_id", kSmallSize}, |
+ {"initrf_main_frame_id", kSmallSize}, |
+ {"initrf_view_is_live", kSmallSize}, |
+ |
+ // Temporary for https://crbug.com/591478. |
+ {"initrf_parent_proxy_exists", kSmallSize}, |
+ {"initrf_render_view_is_live", kSmallSize}, |
+ {"initrf_parent_is_in_same_site_instance", kSmallSize}, |
+ {"initrf_parent_process_is_live", kSmallSize}, |
+ {"initrf_root_is_in_same_site_instance", kSmallSize}, |
+ {"initrf_root_is_in_same_site_instance_as_parent", kSmallSize}, |
+ {"initrf_root_process_is_live", kSmallSize}, |
+ {"initrf_root_proxy_is_live", kSmallSize}, |
+ |
+ // Temporary for https://crbug.com/612711. |
+ {"aci_wrong_sp_extension_id", kSmallSize}, |
+ |
+ // Temporary for https://crbug.com/616149. |
+ {"existing_extension_pref_value_type", crash_keys::kSmallSize}, |
+ }; |
+ |
+ // This dynamic set of keys is used for sets of key value pairs when gathering |
+ // a collection of data, like command line switches or extension IDs. |
+ std::vector<base::debug::CrashKey> keys(fixed_keys, |
+ fixed_keys + arraysize(fixed_keys)); |
+ |
+ crash_keys::GetCrashKeysForCommandLineSwitches(&keys); |
+ |
+ // Register the extension IDs. |
+ { |
+ static char formatted_keys[kExtensionIDMaxCount] |
+ [sizeof(kExtensionID) + 1] = {{0}}; |
+ const size_t formatted_key_len = sizeof(formatted_keys[0]); |
+ for (size_t i = 0; i < kExtensionIDMaxCount; ++i) { |
+ snprintf(formatted_keys[i], formatted_key_len, kExtensionID, i + 1); |
+ base::debug::CrashKey crash_key = {formatted_keys[i], kSmallSize}; |
+ keys.push_back(crash_key); |
+ } |
+ } |
+ |
+ // Register the printer info. |
+ { |
+ static char formatted_keys[kPrinterInfoCount] |
+ [sizeof(kPrinterInfo) + 1] = {{0}}; |
+ const size_t formatted_key_len = sizeof(formatted_keys[0]); |
+ for (size_t i = 0; i < kPrinterInfoCount; ++i) { |
+ // Key names are 1-indexed. |
+ snprintf(formatted_keys[i], formatted_key_len, kPrinterInfo, i + 1); |
+ base::debug::CrashKey crash_key = {formatted_keys[i], kSmallSize}; |
+ keys.push_back(crash_key); |
+ } |
+ } |
+ |
+ return base::debug::InitCrashKeys(&keys[0], keys.size(), kChunkMaxLength); |
+} |
+ |
+} // namespace |
ChromeCrashReporterClient::ChromeCrashReporterClient() {} |
ChromeCrashReporterClient::~ChromeCrashReporterClient() {} |
+#if !defined(NACL_WIN64) |
+// static |
+void ChromeCrashReporterClient::InitializeCrashReportingForProcess() { |
+ static ChromeCrashReporterClient* instance = nullptr; |
+ if (instance) |
+ return; |
+ |
+ instance = new ChromeCrashReporterClient(); |
+ ANNOTATE_LEAKING_OBJECT_PTR(instance); |
+ |
+ std::string process_type = install_static::GetSwitchValueFromCommandLine( |
+ ::GetCommandLineA(), install_static::kProcessType); |
+ if (process_type != install_static::kCrashpadHandler) { |
+ crash_reporter::SetCrashReporterClient(instance); |
+ crash_reporter::InitializeCrashpadWithEmbeddedHandler(process_type.empty(), |
+ process_type); |
+ } |
+} |
+#endif // NACL_WIN64 |
+ |
bool ChromeCrashReporterClient::GetAlternativeCrashDumpLocation( |
base::string16* crash_dir) { |
// By setting the BREAKPAD_DUMP_LOCATION environment variable, an alternate |
@@ -137,8 +317,11 @@ bool ChromeCrashReporterClient::GetCrashDumpLocation( |
return install_static::GetDefaultCrashDumpLocation(crash_dir); |
} |
+// TODO(ananta) |
+// This function should be removed when the new crash key map implementation |
+// lands. |
size_t ChromeCrashReporterClient::RegisterCrashKeys() { |
- return crash_keys::RegisterChromeCrashKeys(); |
+ return RegisterCrashKeysHelper(); |
} |
bool ChromeCrashReporterClient::IsRunningUnattended() { |