| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/common/crash_keys.h" | 5 #include "chrome/common/crash_keys.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/format_macros.h" | 8 #include "base/format_macros.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/strings/string_split.h" | 10 #include "base/strings/string_split.h" |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 #endif | 48 #endif |
| 49 | 49 |
| 50 // Guarantees for crash key sizes. | 50 // Guarantees for crash key sizes. |
| 51 static_assert(kSmallSize <= kSingleChunkLength, | 51 static_assert(kSmallSize <= kSingleChunkLength, |
| 52 "crash key chunk size too small"); | 52 "crash key chunk size too small"); |
| 53 #if defined(OS_MACOSX) | 53 #if defined(OS_MACOSX) |
| 54 static_assert(kMediumSize <= kSingleChunkLength, | 54 static_assert(kMediumSize <= kSingleChunkLength, |
| 55 "mac has medium size crash key chunks"); | 55 "mac has medium size crash key chunks"); |
| 56 #endif | 56 #endif |
| 57 | 57 |
| 58 #if defined(OS_MACOSX) |
| 59 // Crashpad owns the "guid" key. Chrome's metrics client ID is a separate ID |
| 60 // carried in a distinct "metrics_client_id" field. |
| 61 const char kMetricsClientId[] = "metrics_client_id"; |
| 62 #else |
| 58 const char kClientId[] = "guid"; | 63 const char kClientId[] = "guid"; |
| 64 #endif |
| 59 | 65 |
| 60 const char kChannel[] = "channel"; | 66 const char kChannel[] = "channel"; |
| 61 | 67 |
| 62 const char kActiveURL[] = "url-chunk"; | 68 const char kActiveURL[] = "url-chunk"; |
| 63 | 69 |
| 64 const char kFontKeyName[] = "font_key_name"; | 70 const char kFontKeyName[] = "font_key_name"; |
| 65 | 71 |
| 66 const char kSwitch[] = "switch-%" PRIuS; | 72 const char kSwitch[] = "switch-%" PRIuS; |
| 67 const char kNumSwitches[] = "num-switches"; | 73 const char kNumSwitches[] = "num-switches"; |
| 68 | 74 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 | 122 |
| 117 #if defined(KASKO) | 123 #if defined(KASKO) |
| 118 const char kKaskoGuid[] = "kasko-guid"; | 124 const char kKaskoGuid[] = "kasko-guid"; |
| 119 const char kKaskoEquivalentGuid[] = "kasko-equivalent-guid"; | 125 const char kKaskoEquivalentGuid[] = "kasko-equivalent-guid"; |
| 120 #endif | 126 #endif |
| 121 | 127 |
| 122 size_t RegisterChromeCrashKeys() { | 128 size_t RegisterChromeCrashKeys() { |
| 123 // The following keys may be chunked by the underlying crash logging system, | 129 // The following keys may be chunked by the underlying crash logging system, |
| 124 // but ultimately constitute a single key-value pair. | 130 // but ultimately constitute a single key-value pair. |
| 125 base::debug::CrashKey fixed_keys[] = { | 131 base::debug::CrashKey fixed_keys[] = { |
| 132 #if defined(OS_MACOSX) |
| 133 { kMetricsClientId, kSmallSize }, |
| 134 #else |
| 126 { kClientId, kSmallSize }, | 135 { kClientId, kSmallSize }, |
| 136 #endif |
| 127 { kChannel, kSmallSize }, | 137 { kChannel, kSmallSize }, |
| 128 { kActiveURL, kLargeSize }, | 138 { kActiveURL, kLargeSize }, |
| 129 { kNumSwitches, kSmallSize }, | 139 { kNumSwitches, kSmallSize }, |
| 130 { kNumVariations, kSmallSize }, | 140 { kNumVariations, kSmallSize }, |
| 131 { kVariations, kLargeSize }, | 141 { kVariations, kLargeSize }, |
| 132 { kNumExtensionsCount, kSmallSize }, | 142 { kNumExtensionsCount, kSmallSize }, |
| 133 { kShutdownType, kSmallSize }, | 143 { kShutdownType, kSmallSize }, |
| 134 #if !defined(OS_ANDROID) | 144 #if !defined(OS_ANDROID) |
| 135 { kGPUVendorID, kSmallSize }, | 145 { kGPUVendorID, kSmallSize }, |
| 136 { kGPUDeviceID, kSmallSize }, | 146 { kGPUDeviceID, kSmallSize }, |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 DCHECK_GT(n, 0); | 237 DCHECK_GT(n, 0); |
| 228 base::debug::CrashKey crash_key = { formatted_keys[i], kSmallSize }; | 238 base::debug::CrashKey crash_key = { formatted_keys[i], kSmallSize }; |
| 229 keys.push_back(crash_key); | 239 keys.push_back(crash_key); |
| 230 } | 240 } |
| 231 } | 241 } |
| 232 | 242 |
| 233 return base::debug::InitCrashKeys(&keys.at(0), keys.size(), | 243 return base::debug::InitCrashKeys(&keys.at(0), keys.size(), |
| 234 kSingleChunkLength); | 244 kSingleChunkLength); |
| 235 } | 245 } |
| 236 | 246 |
| 247 #if defined(OS_MACOSX) |
| 248 |
| 249 void SetMetricsClientIdFromGUID(const std::string& metrics_client_guid) { |
| 250 std::string stripped_guid(metrics_client_guid); |
| 251 // Remove all instance of '-' char from the GUID. So BCD-WXY becomes BCDWXY. |
| 252 ReplaceSubstringsAfterOffset(&stripped_guid, 0, "-", ""); |
| 253 if (stripped_guid.empty()) |
| 254 return; |
| 255 |
| 256 base::debug::SetCrashKeyValue(kMetricsClientId, stripped_guid); |
| 257 } |
| 258 |
| 259 void ClearMetricsClientId() { |
| 260 base::debug::ClearCrashKey(kMetricsClientId); |
| 261 } |
| 262 |
| 263 #else |
| 264 |
| 237 void SetCrashClientIdFromGUID(const std::string& client_guid) { | 265 void SetCrashClientIdFromGUID(const std::string& client_guid) { |
| 238 std::string stripped_guid(client_guid); | 266 std::string stripped_guid(client_guid); |
| 239 // Remove all instance of '-' char from the GUID. So BCD-WXY becomes BCDWXY. | 267 // Remove all instance of '-' char from the GUID. So BCD-WXY becomes BCDWXY. |
| 240 ReplaceSubstringsAfterOffset(&stripped_guid, 0, "-", ""); | 268 ReplaceSubstringsAfterOffset(&stripped_guid, 0, "-", ""); |
| 241 if (stripped_guid.empty()) | 269 if (stripped_guid.empty()) |
| 242 return; | 270 return; |
| 243 | 271 |
| 244 base::debug::SetCrashKeyValue(kClientId, stripped_guid); | 272 base::debug::SetCrashKeyValue(kClientId, stripped_guid); |
| 245 } | 273 } |
| 246 | 274 |
| 275 #endif |
| 276 |
| 247 static bool IsBoringSwitch(const std::string& flag) { | 277 static bool IsBoringSwitch(const std::string& flag) { |
| 248 #if defined(OS_WIN) | 278 #if defined(OS_WIN) |
| 249 return StartsWithASCII(flag, "--channel=", true) || | 279 return StartsWithASCII(flag, "--channel=", true) || |
| 250 | 280 |
| 251 // No point to including this since we already have a ptype field. | 281 // No point to including this since we already have a ptype field. |
| 252 StartsWithASCII(flag, "--type=", true) || | 282 StartsWithASCII(flag, "--type=", true) || |
| 253 | 283 |
| 254 // Not particularly interesting | 284 // Not particularly interesting |
| 255 StartsWithASCII(flag, "--flash-broker=", true) || | 285 StartsWithASCII(flag, "--flash-broker=", true) || |
| 256 | 286 |
| 257 // Just about everything has this, don't bother. | 287 // Just about everything has this, don't bother. |
| 258 StartsWithASCII(flag, "/prefetch:", true) || | 288 StartsWithASCII(flag, "/prefetch:", true) || |
| 259 | 289 |
| 260 // We handle the plugin path separately since it is usually too big | 290 // We handle the plugin path separately since it is usually too big |
| 261 // to fit in the switches (limited to 63 characters). | 291 // to fit in the switches (limited to 63 characters). |
| 262 StartsWithASCII(flag, "--plugin-path=", true) || | 292 StartsWithASCII(flag, "--plugin-path=", true) || |
| 263 | 293 |
| 264 // This is too big so we end up truncating it anyway. | 294 // This is too big so we end up truncating it anyway. |
| 265 StartsWithASCII(flag, "--force-fieldtrials=", true) || | 295 StartsWithASCII(flag, "--force-fieldtrials=", true) || |
| 266 | 296 |
| 267 // These surround the flags that were added by about:flags, it lets | 297 // These surround the flags that were added by about:flags, it lets |
| 268 // you distinguish which flags were added manually via the command | 298 // you distinguish which flags were added manually via the command |
| 269 // line versus those added through about:flags. For the most part | 299 // line versus those added through about:flags. For the most part |
| 270 // we don't care how an option was enabled, so we strip these. | 300 // we don't care how an option was enabled, so we strip these. |
| 271 // (If you need to know can always look at the PEB). | 301 // (If you need to know can always look at the PEB). |
| 272 flag == "--flag-switches-begin" || | 302 flag == "--flag-switches-begin" || |
| 273 flag == "--flag-switches-end"; | 303 flag == "--flag-switches-end"; |
| 304 #elif defined(OS_MACOSX) |
| 305 // These are carried in their own fields. |
| 306 return StartsWithASCII(flag, "--channel=", true) || |
| 307 StartsWithASCII(flag, "--type=", true) || |
| 308 StartsWithASCII(flag, "--metrics-client-id=", true); |
| 274 #elif defined(OS_CHROMEOS) | 309 #elif defined(OS_CHROMEOS) |
| 275 static const char* const kIgnoreSwitches[] = { | 310 static const char* const kIgnoreSwitches[] = { |
| 276 ::switches::kEnableLogging, | 311 ::switches::kEnableLogging, |
| 277 ::switches::kFlagSwitchesBegin, | 312 ::switches::kFlagSwitchesBegin, |
| 278 ::switches::kFlagSwitchesEnd, | 313 ::switches::kFlagSwitchesEnd, |
| 279 ::switches::kLoggingLevel, | 314 ::switches::kLoggingLevel, |
| 280 ::switches::kPpapiFlashArgs, | 315 ::switches::kPpapiFlashArgs, |
| 281 ::switches::kPpapiFlashPath, | 316 ::switches::kPpapiFlashPath, |
| 282 ::switches::kRegisterPepperPlugins, | 317 ::switches::kRegisterPepperPlugins, |
| 283 ::switches::kUIPrioritizeInGpuProcess, | 318 ::switches::kUIPrioritizeInGpuProcess, |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 } | 438 } |
| 404 | 439 |
| 405 ScopedPrinterInfo::~ScopedPrinterInfo() { | 440 ScopedPrinterInfo::~ScopedPrinterInfo() { |
| 406 for (size_t i = 0; i < kPrinterInfoCount; ++i) { | 441 for (size_t i = 0; i < kPrinterInfoCount; ++i) { |
| 407 std::string key = base::StringPrintf(kPrinterInfo, i + 1); | 442 std::string key = base::StringPrintf(kPrinterInfo, i + 1); |
| 408 base::debug::ClearCrashKey(key); | 443 base::debug::ClearCrashKey(key); |
| 409 } | 444 } |
| 410 } | 445 } |
| 411 | 446 |
| 412 } // namespace crash_keys | 447 } // namespace crash_keys |
| OLD | NEW |