// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/common/child_process_logging.h" #include #include "base/debug/crash_logging.h" #include "base/memory/scoped_ptr.h" #include "base/strings/utf_string_conversions.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/crash_keys.h" #include "chrome/installer/util/google_update_settings.h" #include "components/metrics/client_info.h" namespace child_process_logging { namespace { // exported in breakpad_win.cc: // void __declspec(dllexport) __cdecl SetCrashKeyValueImpl. typedef void (__cdecl *SetCrashKeyValue)(const wchar_t*, const wchar_t*); // exported in breakpad_win.cc: // void __declspec(dllexport) __cdecl ClearCrashKeyValueImpl. typedef void (__cdecl *ClearCrashKeyValue)(const wchar_t*); void SetCrashKeyValueTrampoline(const base::StringPiece& key, const base::StringPiece& value) { static SetCrashKeyValue set_crash_key = NULL; if (!set_crash_key) { HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName); if (!exe_module) return; set_crash_key = reinterpret_cast( GetProcAddress(exe_module, "SetCrashKeyValueImpl")); } if (set_crash_key) { (set_crash_key)(base::UTF8ToWide(key).data(), base::UTF8ToWide(value).data()); } } void ClearCrashKeyValueTrampoline(const base::StringPiece& key) { static ClearCrashKeyValue clear_crash_key = NULL; if (!clear_crash_key) { HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName); if (!exe_module) return; clear_crash_key = reinterpret_cast( GetProcAddress(exe_module, "ClearCrashKeyValueImpl")); } if (clear_crash_key) (clear_crash_key)(base::UTF8ToWide(key).data()); } } // namespace void Init() { // Note: on other platforms, this is set up during Breakpad initialization, // in ChromeBreakpadClient. But on Windows, that is before the DLL module is // loaded, which is a prerequisite of the crash key system. crash_keys::RegisterChromeCrashKeys(); base::debug::SetCrashKeyReportingFunctions( &SetCrashKeyValueTrampoline, &ClearCrashKeyValueTrampoline); // This would be handled by BreakpadClient::SetCrashClientIdFromGUID(), but // because of the aforementioned issue, crash keys aren't ready yet at the // time of Breakpad initialization, load the client id backed up in Google // Update settings instead. scoped_ptr client_info = GoogleUpdateSettings::LoadMetricsClientInfo(); if (client_info) crash_keys::SetCrashClientIdFromGUID(client_info->client_id); } } // namespace child_process_logging