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