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..e2ebc7fb1c472deb79a412f9c00401fa955b77d4 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(L"chrome_elf.dll"); |
scottmg
2016/06/27 20:42:49
Here,
ananta
2016/06/27 22:52:23
Done.
|
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(L"chrome_elf.dll"); |
scottmg
2016/06/27 20:42:48
here,
ananta
2016/06/27 22:52:23
Done.
|
return reinterpret_cast<ClearCrashKeyValue>( |
- exe_module ? GetProcAddress(exe_module, "ClearCrashKeyValueImpl") |
+ elf_module ? GetProcAddress(elf_module, "ClearCrashKeyValueImpl") |
: nullptr); |
}(); |
if (clear_crash_key) |
@@ -55,18 +55,37 @@ void ClearCrashKeyValueTrampoline(const base::StringPiece& key) { |
} // namespace |
void Init() { |
- 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. |
+ // 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); |
+ |
+ // Register crash keys using chrome_elf if it is loaded. This is because |
+ // chrome_elf and chrome and other executables have their own copies of |
+ // base. |
+ // TODO(ananta) |
+ // Remove this when the change to not require crash key registration lands. |
+ HMODULE elf_module = GetModuleHandle(L"chrome_elf.dll"); |
scottmg
2016/06/27 20:42:49
and here too.
ananta
2016/06/27 22:52:23
Done.
|
+ if (elf_module) { |
+ using RegisterCrashKeysAndSetMetricsIdFunction = |
+ void (*)(const char* client_id); |
+ RegisterCrashKeysAndSetMetricsIdFunction register_keys_fn = |
+ reinterpret_cast<RegisterCrashKeysAndSetMetricsIdFunction>( |
+ ::GetProcAddress(elf_module, "RegisterCrashKeysAndSetMetricsId")); |
+ DCHECK(register_keys_fn); |
+ register_keys_fn(client_info ? client_info->client_id.c_str() : nullptr); |
+ } else { |
scottmg
2016/06/27 20:42:48
When is this branch taken?
ananta
2016/06/27 22:52:23
When we are in tests code like browser_tests or in
|
+ crash_keys::RegisterChromeCrashKeys(); |
+ if (client_info) |
+ crash_keys::SetMetricsClientIdFromGUID(client_info->client_id); |
+ } |
+ |
+ base::debug::SetCrashKeyReportingFunctions(&SetCrashKeyValueTrampoline, |
+ &ClearCrashKeyValueTrampoline); |
} |
} // namespace child_process_logging |