| Index: chrome/common/child_process_logging_win.cc
|
| diff --git a/chrome/common/child_process_logging_win.cc b/chrome/common/child_process_logging_win.cc
|
| index 3963bc3cc2eefd5c6e74ed5c4883d453c91ff7ee..3460812edc0551745f9264347d399e93eba0f020 100644
|
| --- a/chrome/common/child_process_logging_win.cc
|
| +++ b/chrome/common/child_process_logging_win.cc
|
| @@ -29,10 +29,10 @@ typedef void(__cdecl* ClearCrashKeyValue)(const wchar_t*);
|
|
|
| void SetCrashKeyValueTrampoline(const base::StringPiece& key,
|
| const base::StringPiece& value) {
|
| - static SetCrashKeyValue set_crash_key = [](){
|
| - HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
|
| + static SetCrashKeyValue set_crash_key = []() {
|
| + HMODULE elf_module = GetModuleHandle(chrome::kChromeElfDllName);
|
| return reinterpret_cast<SetCrashKeyValue>(
|
| - exe_module ? GetProcAddress(exe_module, "SetCrashKeyValueImpl")
|
| + elf_module ? GetProcAddress(elf_module, "SetCrashKeyValueImpl")
|
| : nullptr);
|
| }();
|
| if (set_crash_key) {
|
| @@ -42,10 +42,10 @@ void SetCrashKeyValueTrampoline(const base::StringPiece& key,
|
| }
|
|
|
| void ClearCrashKeyValueTrampoline(const base::StringPiece& key) {
|
| - static ClearCrashKeyValue clear_crash_key = [](){
|
| - HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName);
|
| + static ClearCrashKeyValue clear_crash_key = []() {
|
| + HMODULE elf_module = GetModuleHandle(chrome::kChromeElfDllName);
|
| return reinterpret_cast<ClearCrashKeyValue>(
|
| - exe_module ? GetProcAddress(exe_module, "ClearCrashKeyValueImpl")
|
| + elf_module ? GetProcAddress(elf_module, "ClearCrashKeyValueImpl")
|
| : nullptr);
|
| }();
|
| if (clear_crash_key)
|
| @@ -55,7 +55,6 @@ void ClearCrashKeyValueTrampoline(const base::StringPiece& key) {
|
| } // namespace
|
|
|
| void Init() {
|
| - crash_keys::RegisterChromeCrashKeys();
|
| base::debug::SetCrashKeyReportingFunctions(&SetCrashKeyValueTrampoline,
|
| &ClearCrashKeyValueTrampoline);
|
|
|
| @@ -63,10 +62,39 @@ void Init() {
|
| // 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.
|
| + // Please note if we are using Crashpad via chrome_elf then we need to call
|
| + // into chrome_elf to pass in the client id.
|
| std::unique_ptr<metrics::ClientInfo> client_info =
|
| GoogleUpdateSettings::LoadMetricsClientInfo();
|
| - if (client_info)
|
| - crash_keys::SetMetricsClientIdFromGUID(client_info->client_id);
|
| +
|
| + // Set the client id in chrome_elf if it is loaded. We should not be
|
| + // registering crash keys in this case as that would already have been
|
| + // done by chrome_elf.
|
| + HMODULE elf_module = GetModuleHandle(chrome::kChromeElfDllName);
|
| + if (elf_module) {
|
| +// TODO(ananta)
|
| +// Remove this when the change to not require crash key registration lands.
|
| +// Please note that we are registering the crash keys twice if chrome_elf is
|
| +// loaded. Once in chrome_elf and once in the current module. Alternatively
|
| +// we could implement a crash key lookup trampoline which defers to
|
| +// chrome_elf. We decided to go with the duplicate key registration for
|
| +// simplicity.
|
| +#if !defined(COMPONENT_BUILD)
|
| + crash_keys::RegisterChromeCrashKeys();
|
| +#endif
|
| + using SetMetricsClientIdFunction = void (*)(const char* client_id);
|
| + SetMetricsClientIdFunction set_metrics_id_fn =
|
| + reinterpret_cast<SetMetricsClientIdFunction>(
|
| + ::GetProcAddress(elf_module, "SetMetricsClientId"));
|
| + DCHECK(set_metrics_id_fn);
|
| + set_metrics_id_fn(client_info ? client_info->client_id.c_str() : nullptr);
|
| + } else {
|
| + // TODO(ananta)
|
| + // Remove this when the change to not require crash key registration lands.
|
| + crash_keys::RegisterChromeCrashKeys();
|
| + if (client_info)
|
| + crash_keys::SetMetricsClientIdFromGUID(client_info->client_id);
|
| + }
|
| }
|
|
|
| } // namespace child_process_logging
|
|
|