| Index: components/breakpad/app/breakpad_win.cc
|
| diff --git a/components/breakpad/app/breakpad_win.cc b/components/breakpad/app/breakpad_win.cc
|
| index 76f8fe7ee92475d48cd2ea0350fa716b48867ac8..b721b2498c01419427e4ed275060e472f0fb6fe9 100644
|
| --- a/components/breakpad/app/breakpad_win.cc
|
| +++ b/components/breakpad/app/breakpad_win.cc
|
| @@ -396,6 +396,29 @@ long WINAPI ServiceExceptionFilter(EXCEPTION_POINTERS* info) {
|
| return EXCEPTION_EXECUTE_HANDLER;
|
| }
|
|
|
| +// Sets |key| to |value|, g_dynamic_entries_lock must be held.
|
| +static void SetCrashKeyValueLocked(const std::wstring& safe_key,
|
| + const std::wstring& safe_value) {
|
| + DCHECK(g_dynamic_entries && g_dynamic_entries_lock);
|
| + DCHECK(safe_key.length() < google_breakpad::CustomInfoEntry::kNameMaxLength);
|
| + DCHECK(safe_value.length() <
|
| + google_breakpad::CustomInfoEntry::kValueMaxLength);
|
| + g_dynamic_entries_lock->AssertAcquired();
|
| +
|
| + DynamicEntriesMap::iterator it = g_dynamic_entries->find(safe_key);
|
| + google_breakpad::CustomInfoEntry* entry = NULL;
|
| + if (it == g_dynamic_entries->end()) {
|
| + if (g_dynamic_entries->size() >= kMaxDynamicEntries)
|
| + return;
|
| + entry = &(*g_custom_entries)[g_dynamic_keys_offset++];
|
| + g_dynamic_entries->insert(std::make_pair(safe_key, entry));
|
| + } else {
|
| + entry = it->second;
|
| + }
|
| +
|
| + entry->set(safe_key.data(), safe_value.data());
|
| +}
|
| +
|
| // NOTE: This function is used by SyzyASAN to annotate crash reports. If you
|
| // change the name or signature of this function you will break SyzyASAN
|
| // instrumented releases of Chrome. Please contact syzygy-team@chromium.org
|
| @@ -419,18 +442,28 @@ extern "C" void __declspec(dllexport) __cdecl SetCrashKeyValueImpl(
|
| DCHECK(g_dynamic_entries_lock);
|
| base::AutoLock lock(*g_dynamic_entries_lock);
|
|
|
| - DynamicEntriesMap::iterator it = g_dynamic_entries->find(safe_key);
|
| - google_breakpad::CustomInfoEntry* entry = NULL;
|
| - if (it == g_dynamic_entries->end()) {
|
| - if (g_dynamic_entries->size() >= kMaxDynamicEntries)
|
| - return;
|
| - entry = &(*g_custom_entries)[g_dynamic_keys_offset++];
|
| - g_dynamic_entries->insert(std::make_pair(safe_key, entry));
|
| - } else {
|
| - entry = it->second;
|
| - }
|
| + SetCrashKeyValueLocked(safe_key, safe_value);
|
| +
|
| + // TODO(siggi): remove this code, see http://crbug.com/371817.
|
| + static size_t guid_set_count = 0;
|
| + if (safe_key == L"guid") {
|
| + // Bracket the value to get something recorded if it's set to the empty
|
| + // string. Truncate to 61 char max, to allow for brackets and terminating
|
| + // zero in the allotted 64 chars.
|
| + std::wstring bracketed_guid = base::StringPrintf(L"{%.61ls}", value);
|
| + if (guid_set_count == 0) {
|
| + // Keep track of the first GUID set.
|
| + SetCrashKeyValueLocked(L"first-guid", bracketed_guid);
|
| + } else {
|
| + // Keep track of the last GUID set.
|
| + SetCrashKeyValueLocked(L"last-guid", bracketed_guid);
|
| + }
|
|
|
| - entry->set(safe_key.data(), safe_value.data());
|
| + // Bump the set count and record the latest.
|
| + ++guid_set_count;
|
| + SetCrashKeyValueLocked(L"guid-set-count",
|
| + base::StringPrintf(L"%d", guid_set_count));
|
| + }
|
| }
|
|
|
| extern "C" void __declspec(dllexport) __cdecl ClearCrashKeyValueImpl(
|
| @@ -447,6 +480,15 @@ extern "C" void __declspec(dllexport) __cdecl ClearCrashKeyValueImpl(
|
| return;
|
|
|
| it->second->set_value(NULL);
|
| +
|
| + // TODO(siggi): remove this code, see http://crbug.com/371817.
|
| + static size_t guid_clear_count = 0;
|
| + if (key_string == L"guid") {
|
| + // Bump the clear count and record the latest.
|
| + ++guid_clear_count;
|
| + SetCrashKeyValueLocked(L"guid-clear-count",
|
| + base::StringPrintf(L"%d", guid_clear_count));
|
| + }
|
| }
|
|
|
| } // namespace
|
|
|