12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/crash_keys.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/command_line.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/format_macros.h" 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/logging.h" 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/strings/string_split.h" 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/string_util.h" 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/stringprintf.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/strings/utf_string_conversions.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "breakpad/src/common/simple_string_dictionary.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_WIN) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "breakpad/src/client/windows/common/ipc_protocol.h" 19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#elif defined(OS_CHROMEOS) 20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/common/chrome_switches.h" 21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "gpu/command_buffer/service/gpu_switches.h" 22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/gl/gl_switches.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace crash_keys { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A small crash key, guaranteed to never be split into multiple pieces. 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kSmallSize = 63; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A medium crash key, which will be chunked on certain platforms but not 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// others. Guaranteed to never be more than four chunks. 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kMediumSize = kSmallSize * 4; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A large crash key, which will be chunked on all platforms. This should be 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// used sparingly. 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kLargeSize = kSmallSize * 16; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The maximum lengths specified by breakpad include the trailing NULL, so 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the actual length of the string is one less. 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const size_t kSingleChunkLength = 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) google_breakpad::SimpleStringDictionary::value_size - 1; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_WIN) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const size_t kSingleChunkLength = 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) google_breakpad::CustomInfoEntry::kValueMaxLength - 1; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const size_t kSingleChunkLength = 63; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Guarantees for crash key sizes. 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)COMPILE_ASSERT(kSmallSize <= kSingleChunkLength, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) crash_key_chunk_size_too_small); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)COMPILE_ASSERT(kMediumSize <= kSingleChunkLength, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mac_has_medium_size_crash_key_chunks); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kClientId[] = "guid"; 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)const char kChannel[] = "channel"; 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kActiveURL[] = "url-chunk"; 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kFontKeyName[] = "font_key_name"; 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)const char kSwitch[] = "switch-%" PRIuS; 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)const char kNumSwitches[] = "num-switches"; 68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kNumVariations[] = "num-experiments"; 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kVariations[] = "variations"; 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kExtensionID[] = "extension-%" PRIuS; 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kNumExtensionsCount[] = "num-extensions"; 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)const char kNumberOfViews[] = "num-views"; 76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kShutdownType[] = "shutdown-type"; 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if !defined(OS_ANDROID) 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kGPUVendorID[] = "gpu-venid"; 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kGPUDeviceID[] = "gpu-devid"; 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kGPUDriverVersion[] = "gpu-driver"; 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kGPUPixelShaderVersion[] = "gpu-psver"; 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kGPUVertexShaderVersion[] = "gpu-vsver"; 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_MACOSX) 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kGPUGLVersion[] = "gpu-glver"; 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#elif defined(OS_POSIX) 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kGPUVendor[] = "gpu-gl-vendor"; 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kGPURenderer[] = "gpu-gl-renderer"; 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)const char kPrinterInfo[] = "prn-info-%" PRIuS; 94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kNumberOfUsers[] = "num-users"; 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_MACOSX) 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace mac { 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kFirstNSException[] = "firstexception"; 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kFirstNSExceptionTrace[] = "firstexception_bt"; 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kLastNSException[] = "lastexception"; 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kLastNSExceptionTrace[] = "lastexception_bt"; 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kNSException[] = "nsexception"; 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kNSExceptionTrace[] = "nsexception_bt"; 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kSendAction[] = "sendaction"; 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kZombie[] = "zombie"; 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kZombieTrace[] = "zombie_dealloc_bt"; 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace mac 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)size_t RegisterChromeCrashKeys() { 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The following keys may be chunked by the underlying crash logging system, 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // but ultimately constitute a single key-value pair. 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::debug::CrashKey fixed_keys[] = { 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { kClientId, kSmallSize }, 124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) { kChannel, kSmallSize }, 1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { kActiveURL, kLargeSize }, 126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) { kNumSwitches, kSmallSize }, 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) { kNumVariations, kSmallSize }, 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) { kVariations, kLargeSize }, 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) { kNumExtensionsCount, kSmallSize }, 130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) { kNumberOfViews, kSmallSize }, 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { kShutdownType, kSmallSize }, 132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#if !defined(OS_ANDROID) 133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) { kGPUVendorID, kSmallSize }, 134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) { kGPUDeviceID, kSmallSize }, 135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#endif 136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) { kGPUDriverVersion, kSmallSize }, 137424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) { kGPUPixelShaderVersion, kSmallSize }, 138424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) { kGPUVertexShaderVersion, kSmallSize }, 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_MACOSX) 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { kGPUGLVersion, kSmallSize }, 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#elif defined(OS_POSIX) 142424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) { kGPUVendor, kSmallSize }, 143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) { kGPURenderer, kSmallSize }, 144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#endif 1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // base/: 14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { "dm-usage", kSmallSize }, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // content/: 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { kFontKeyName, kSmallSize}, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "ppapi_path", kMediumSize }, 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "subresource_url", kLargeSize }, 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { kNumberOfUsers, kSmallSize }, 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { mac::kFirstNSException, kMediumSize }, 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { mac::kFirstNSExceptionTrace, kMediumSize }, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { mac::kLastNSException, kMediumSize }, 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { mac::kLastNSExceptionTrace, kMediumSize }, 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { mac::kNSException, kMediumSize }, 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { mac::kNSExceptionTrace, kMediumSize }, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { mac::kSendAction, kMediumSize }, 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { mac::kZombie, kMediumSize }, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { mac::kZombieTrace, kMediumSize }, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // content/: 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "channel_error_bt", kMediumSize }, 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "remove_route_bt", kMediumSize }, 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "rwhvm_window", kMediumSize }, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // media/: 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "VideoCaptureDeviceQTKit", kSmallSize }, 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This dynamic set of keys is used for sets of key value pairs when gathering 17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // a collection of data, like command line switches or extension IDs. 17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::vector<base::debug::CrashKey> keys( 17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fixed_keys, fixed_keys + arraysize(fixed_keys)); 17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Register the switches. 18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) { 18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The fixed_keys names are string constants. Use static storage for 18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // formatted key names as well, since they will persist for the duration of 18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the program. 184d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static char formatted_keys[kSwitchesMaxCount][sizeof(kSwitch) + 1] = 185d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) {{ 0 }}; 186d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const size_t formatted_key_len = sizeof(formatted_keys[0]); 187d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (size_t i = 0; i < kSwitchesMaxCount; ++i) { 188d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Name the keys using 1-based indexing. 189d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int n = base::snprintf( 190d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) formatted_keys[i], formatted_key_len, kSwitch, i + 1); 191d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK_GT(n, 0); 192d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::debug::CrashKey crash_key = { formatted_keys[i], kSmallSize }; 193d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) keys.push_back(crash_key); 194d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 195d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Register the extension IDs. 198d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) { 19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static char formatted_keys[kExtensionIDMaxCount][sizeof(kExtensionID) + 1] = 20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) {{ 0 }}; 20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const size_t formatted_key_len = sizeof(formatted_keys[0]); 20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < kExtensionIDMaxCount; ++i) { 20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int n = base::snprintf( 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) formatted_keys[i], formatted_key_len, kExtensionID, i + 1); 20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK_GT(n, 0); 20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::debug::CrashKey crash_key = { formatted_keys[i], kSmallSize }; 20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) keys.push_back(crash_key); 20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 20958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 211d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Register the printer info. 212d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) { 213d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static char formatted_keys[kPrinterInfoCount][sizeof(kPrinterInfo) + 1] = 214d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) {{ 0 }}; 215d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const size_t formatted_key_len = sizeof(formatted_keys[0]); 216d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (size_t i = 0; i < kPrinterInfoCount; ++i) { 217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Key names are 1-indexed. 218d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int n = base::snprintf( 219d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) formatted_keys[i], formatted_key_len, kPrinterInfo, i + 1); 220d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK_GT(n, 0); 221d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::debug::CrashKey crash_key = { formatted_keys[i], kSmallSize }; 222d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) keys.push_back(crash_key); 223d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return base::debug::InitCrashKeys(&keys.at(0), keys.size(), 22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kSingleChunkLength); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SetCrashClientIdFromGUID(const std::string& client_guid) { 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string stripped_guid(client_guid); 2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Remove all instance of '-' char from the GUID. So BCD-WXY becomes BCDWXY. 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReplaceSubstringsAfterOffset(&stripped_guid, 0, "-", ""); 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (stripped_guid.empty()) 2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::debug::SetCrashKeyValue(kClientId, stripped_guid); 2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 240d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)static bool IsBoringSwitch(const std::string& flag) { 241d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_WIN) 242d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return StartsWithASCII(flag, "--channel=", true) || 243d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 244d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // No point to including this since we already have a ptype field. 245d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) StartsWithASCII(flag, "--type=", true) || 246d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 247d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Not particularly interesting 248d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) StartsWithASCII(flag, "--flash-broker=", true) || 249d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Just about everything has this, don't bother. 251d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) StartsWithASCII(flag, "/prefetch:", true) || 252d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 253d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // We handle the plugin path separately since it is usually too big 254d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // to fit in the switches (limited to 63 characters). 255d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) StartsWithASCII(flag, "--plugin-path=", true) || 256d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 257d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // This is too big so we end up truncating it anyway. 2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) StartsWithASCII(flag, "--force-fieldtrials=", true) || 259d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 260d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // These surround the flags that were added by about:flags, it lets 261d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // you distinguish which flags were added manually via the command 262d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // line versus those added through about:flags. For the most part 263d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // we don't care how an option was enabled, so we strip these. 264d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // (If you need to know can always look at the PEB). 265d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) flag == "--flag-switches-begin" || 266d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) flag == "--flag-switches-end"; 267a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#elif defined(OS_CHROMEOS) 268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static const char* kIgnoreSwitches[] = { 269a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ::switches::kEnableImplSidePainting, 270a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ::switches::kEnableLogging, 271a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ::switches::kFlagSwitchesBegin, 272a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ::switches::kFlagSwitchesEnd, 273a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ::switches::kLoggingLevel, 274a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ::switches::kPpapiFlashArgs, 275a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ::switches::kPpapiFlashPath, 276a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ::switches::kRegisterPepperPlugins, 277a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ::switches::kUIPrioritizeInGpuProcess, 278a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ::switches::kUseGL, 279a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ::switches::kUserDataDir, 280a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ::switches::kV, 281a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ::switches::kVModule, 282a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Cros/CC flgas are specified as raw strings to avoid dependency. 283a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "ash-default-wallpaper-large", 284a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "ash-default-wallpaper-small", 285a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "ash-guest-wallpaper-large", 286a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "ash-guest-wallpaper-small", 287a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "enterprise-enable-forced-re-enrollment", 288a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "enterprise-enrollment-initial-modulus", 289a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "enterprise-enrollment-modulus-limit", 290a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "login-profile", 291a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "login-user", 292a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "max-tiles-for-interest-area", 293a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "max-unused-resource-memory-usage-percentage", 294a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "termination-message-file", 295a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch "use-cras", 296a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch }; 297a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!StartsWithASCII(flag, "--", true)) 298a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return false; 299a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch std::size_t end = flag.find("="); 300a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int len = (end == std::string::npos) ? flag.length() - 2 : end - 2; 301a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (size_t i = 0; i < arraysize(kIgnoreSwitches); ++i) { 302a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (flag.compare(2, len, kIgnoreSwitches[i]) == 0) 303a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return true; 304a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 305a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return false; 306d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#else 307d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return false; 308d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 309d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 310d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 311d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void SetSwitchesFromCommandLine(const CommandLine* command_line) { 312d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(command_line); 313d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!command_line) 314d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return; 315d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 316d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const CommandLine::StringVector& argv = command_line->argv(); 317d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 318d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Set the number of switches in case size > kNumSwitches. 319d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::debug::SetCrashKeyValue(kNumSwitches, 320d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::StringPrintf("%" PRIuS, argv.size() - 1)); 321d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 322d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) size_t key_i = 1; // Key names are 1-indexed. 323d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 324d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Go through the argv, skipping the exec path. 325d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (size_t i = 1; i < argv.size(); ++i) { 326d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_WIN) 327d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string switch_str = base::WideToUTF8(argv[i]); 328d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#else 329d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string switch_str = argv[i]; 330d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 331d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 332d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Skip uninteresting switches. 333d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (IsBoringSwitch(switch_str)) 334d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) continue; 335d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Stop if there are too many switches. 3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (i > crash_keys::kSwitchesMaxCount) 3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 3394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 340d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string key = base::StringPrintf(kSwitch, key_i++); 341d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::debug::SetCrashKeyValue(key, switch_str); 342d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 343d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 344d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Clear any remaining switches. 345d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (; key_i <= kSwitchesMaxCount; ++key_i) { 346d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::debug::ClearCrashKey(base::StringPrintf(kSwitch, key_i)); 347d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 348d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 349d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 35068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void SetVariationsList(const std::vector<std::string>& variations) { 35168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::debug::SetCrashKeyValue(kNumVariations, 35268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::StringPrintf("%" PRIuS, variations.size())); 35368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 35468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::string variations_string; 35568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) variations_string.reserve(kLargeSize); 35668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 35768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (size_t i = 0; i < variations.size(); ++i) { 35868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::string& variation = variations[i]; 35968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Do not truncate an individual experiment. 36068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (variations_string.size() + variation.size() >= kLargeSize) 36168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 36268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) variations_string += variation; 36368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) variations_string += ","; 36468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 36568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 36668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::debug::SetCrashKeyValue(kVariations, variations_string); 36768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 36868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 36958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void SetActiveExtensions(const std::set<std::string>& extensions) { 37058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::debug::SetCrashKeyValue(kNumExtensionsCount, 37158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::StringPrintf("%" PRIuS, extensions.size())); 37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 37358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::set<std::string>::const_iterator it = extensions.begin(); 37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (size_t i = 0; i < kExtensionIDMaxCount; ++i) { 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string key = base::StringPrintf(kExtensionID, i + 1); 37658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (it == extensions.end()) { 37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::debug::ClearCrashKey(key); 37858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::debug::SetCrashKeyValue(key, *it); 38058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ++it; 38158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 38258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 38358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 385d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)ScopedPrinterInfo::ScopedPrinterInfo(const base::StringPiece& data) { 386d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<std::string> info; 387d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::SplitString(data.as_string(), ';', &info); 388d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (size_t i = 0; i < kPrinterInfoCount; ++i) { 389d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string key = base::StringPrintf(kPrinterInfo, i + 1); 390d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string value; 391d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (i < info.size()) 392d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) value = info[i]; 393d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::debug::SetCrashKeyValue(key, value); 394d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 395d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 396d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 397d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)ScopedPrinterInfo::~ScopedPrinterInfo() { 398d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (size_t i = 0; i < kPrinterInfoCount; ++i) { 399d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string key = base::StringPrintf(kPrinterInfo, i + 1); 400d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::debug::ClearCrashKey(key); 401d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 402d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 403d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace crash_keys 405