| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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/app/chrome_crash_reporter_client.h" | 5 #include "chrome/app/chrome_crash_reporter_client.h" |
| 6 | 6 |
| 7 #include "base/atomicops.h" | 7 #include "base/atomicops.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/environment.h" | 9 #include "base/environment.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 KEY_ALL_ACCESS) != ERROR_SUCCESS) { | 209 KEY_ALL_ACCESS) != ERROR_SUCCESS) { |
| 210 return; | 210 return; |
| 211 } | 211 } |
| 212 | 212 |
| 213 // We use the current process id and the current tick count as a (hopefully) | 213 // We use the current process id and the current tick count as a (hopefully) |
| 214 // unique combination for the crash dump value. There's a small chance that | 214 // unique combination for the crash dump value. There's a small chance that |
| 215 // across a reboot we might have a crash dump signal written, and the next | 215 // across a reboot we might have a crash dump signal written, and the next |
| 216 // browser process might have the same process id and tick count, but crash | 216 // browser process might have the same process id and tick count, but crash |
| 217 // before consuming the signal (overwriting the signal with an identical one). | 217 // before consuming the signal (overwriting the signal with an identical one). |
| 218 // For now, we're willing to live with that risk. | 218 // For now, we're willing to live with that risk. |
| 219 int length = base::strings::SafeSPrintf(g_browser_crash_dump_prefix, | 219 if (base::strings::SafeSPrintf(g_browser_crash_dump_prefix, |
| 220 kBrowserCrashDumpPrefixTemplate, | 220 kBrowserCrashDumpPrefixTemplate, |
| 221 chrome::kChromeVersion, | 221 chrome::kChromeVersion, |
| 222 ::GetCurrentProcessId(), | 222 ::GetCurrentProcessId(), |
| 223 ::GetTickCount()); | 223 ::GetTickCount()) <= 0) { |
| 224 if (length <= 0) { | |
| 225 NOTREACHED(); | 224 NOTREACHED(); |
| 226 g_browser_crash_dump_prefix[0] = '\0'; | 225 g_browser_crash_dump_prefix[0] = '\0'; |
| 227 return; | 226 return; |
| 228 } | 227 } |
| 229 | 228 |
| 230 // Hold the registry key in a global for update on crash dump. | 229 // Hold the registry key in a global for update on crash dump. |
| 231 g_browser_crash_dump_regkey = regkey.Take(); | 230 g_browser_crash_dump_regkey = regkey.Take(); |
| 232 } | 231 } |
| 233 | 232 |
| 234 void ChromeCrashReporterClient::RecordCrashDumpAttempt(bool is_real_crash) { | 233 void ChromeCrashReporterClient::RecordCrashDumpAttempt(bool is_real_crash) { |
| 235 // If we're not a browser (or the registry is unavailable to us for some | 234 // If we're not a browser (or the registry is unavailable to us for some |
| 236 // reason) then there's nothing to do. | 235 // reason) then there's nothing to do. |
| 237 if (g_browser_crash_dump_regkey == NULL) | 236 if (g_browser_crash_dump_regkey == NULL) |
| 238 return; | 237 return; |
| 239 | 238 |
| 240 // Generate the final value name we'll use (appends the crash number to the | 239 // Generate the final value name we'll use (appends the crash number to the |
| 241 // base value name). | 240 // base value name). |
| 242 const size_t kMaxValueSize = 2 * kBrowserCrashDumpPrefixLength; | 241 const size_t kMaxValueSize = 2 * kBrowserCrashDumpPrefixLength; |
| 243 char value_name[kMaxValueSize + 1] = {}; | 242 char value_name[kMaxValueSize + 1] = {}; |
| 244 int length = base::strings::SafeSPrintf( | 243 if (base::strings::SafeSPrintf( |
| 245 value_name, | 244 value_name, "%s-%x", g_browser_crash_dump_prefix, |
| 246 "%s-%x", | 245 base::subtle::NoBarrier_AtomicIncrement(&g_browser_crash_dump_count, |
| 247 g_browser_crash_dump_prefix, | 246 1)) > 0) { |
| 248 base::subtle::NoBarrier_AtomicIncrement(&g_browser_crash_dump_count, 1)); | |
| 249 | |
| 250 if (length > 0) { | |
| 251 DWORD value_dword = is_real_crash ? 1 : 0; | 247 DWORD value_dword = is_real_crash ? 1 : 0; |
| 252 ::RegSetValueExA(g_browser_crash_dump_regkey, value_name, 0, REG_DWORD, | 248 ::RegSetValueExA(g_browser_crash_dump_regkey, value_name, 0, REG_DWORD, |
| 253 reinterpret_cast<BYTE*>(&value_dword), | 249 reinterpret_cast<BYTE*>(&value_dword), |
| 254 sizeof(value_dword)); | 250 sizeof(value_dword)); |
| 255 } | 251 } |
| 256 } | 252 } |
| 257 | 253 |
| 258 bool ChromeCrashReporterClient::ReportingIsEnforcedByPolicy( | 254 bool ChromeCrashReporterClient::ReportingIsEnforcedByPolicy( |
| 259 bool* breakpad_enabled) { | 255 bool* breakpad_enabled) { |
| 260 // Determine whether configuration management allows loading the crash reporter. | 256 // Determine whether configuration management allows loading the crash reporter. |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 373 bool ChromeCrashReporterClient::EnableBreakpadForProcess( | 369 bool ChromeCrashReporterClient::EnableBreakpadForProcess( |
| 374 const std::string& process_type) { | 370 const std::string& process_type) { |
| 375 return process_type == switches::kRendererProcess || | 371 return process_type == switches::kRendererProcess || |
| 376 process_type == switches::kPluginProcess || | 372 process_type == switches::kPluginProcess || |
| 377 process_type == switches::kPpapiPluginProcess || | 373 process_type == switches::kPpapiPluginProcess || |
| 378 process_type == switches::kZygoteProcess || | 374 process_type == switches::kZygoteProcess || |
| 379 process_type == switches::kGpuProcess; | 375 process_type == switches::kGpuProcess; |
| 380 } | 376 } |
| 381 | 377 |
| 382 } // namespace chrome | 378 } // namespace chrome |
| OLD | NEW |