Index: chrome/browser/crash_handler_host_linux.cc |
diff --git a/chrome/browser/crash_handler_host_linux.cc b/chrome/browser/crash_handler_host_linux.cc |
index a2393bd1734783a3aa435d4775b3d403e2efd021..8facc85b8f317a27d2a73a924bb2af5d3be66d5e 100644 |
--- a/chrome/browser/crash_handler_host_linux.cc |
+++ b/chrome/browser/crash_handler_host_linux.cc |
@@ -27,7 +27,7 @@ |
#include "breakpad/src/client/linux/handler/exception_handler.h" |
#include "breakpad/src/client/linux/minidump_writer/linux_dumper.h" |
#include "breakpad/src/client/linux/minidump_writer/minidump_writer.h" |
-#include "chrome/app/breakpad_linux.h" |
+#include "chrome/app/breakpad_linux_impl.h" |
#include "chrome/common/chrome_paths.h" |
#include "chrome/common/env_vars.h" |
#include "content/public/browser/browser_thread.h" |
@@ -60,6 +60,7 @@ void CrashDumpTask(CrashHandlerHostLinux* handler, BreakpadInfo* info) { |
delete[] info->crash_url; |
delete[] info->guid; |
delete[] info->distro; |
+ delete info->crash_keys; |
delete info; |
} |
@@ -128,14 +129,8 @@ void CrashHandlerHostLinux::OnFileCanReadWithoutBlocking(int fd) { |
// |
// The message sender is in chrome/app/breakpad_linux.cc. |
-#if !defined(ADDRESS_SANITIZER) |
- const size_t kIovSize = 8; |
-#else |
- const size_t kIovSize = 9; |
-#endif |
- |
struct msghdr msg = {0}; |
- struct iovec iov[kIovSize]; |
+ struct iovec iov[kCrashIovSize]; |
// Freed in WriteDumpFile(); |
char* crash_context = new char[kCrashContextSize]; |
@@ -147,6 +142,13 @@ void CrashHandlerHostLinux::OnFileCanReadWithoutBlocking(int fd) { |
asan_report_str_ = new char[kMaxAsanReportSize + 1]; |
#endif |
+ // Freed in CrashDumpTask(). |
+ CrashKeyStorage* crash_keys = new CrashKeyStorage; |
+ google_breakpad::SerializedNonAllocatingMap* serialized_crash_keys; |
+ size_t crash_keys_size = crash_keys->Serialize( |
+ const_cast<const google_breakpad::SerializedNonAllocatingMap**>( |
+ &serialized_crash_keys)); |
+ |
char* tid_buf_addr = NULL; |
int tid_fd = -1; |
uint64_t uptime; |
@@ -162,7 +164,8 @@ void CrashHandlerHostLinux::OnFileCanReadWithoutBlocking(int fd) { |
#if defined(ADDRESS_SANITIZER) |
kMaxAsanReportSize + 1 + |
#endif |
- sizeof(oom_size); |
+ sizeof(oom_size) + |
+ crash_keys_size; |
iov[0].iov_base = crash_context; |
iov[0].iov_len = kCrashContextSize; |
iov[1].iov_base = guid; |
@@ -179,12 +182,14 @@ void CrashHandlerHostLinux::OnFileCanReadWithoutBlocking(int fd) { |
iov[6].iov_len = sizeof(uptime); |
iov[7].iov_base = &oom_size; |
iov[7].iov_len = sizeof(oom_size); |
+ iov[8].iov_base = serialized_crash_keys; |
+ iov[8].iov_len = crash_keys_size; |
#if defined(ADDRESS_SANITIZER) |
- iov[8].iov_base = asan_report_str_; |
- iov[8].iov_len = kMaxAsanReportSize + 1; |
+ iov[9].iov_base = asan_report_str_; |
+ iov[9].iov_len = kMaxAsanReportSize + 1; |
#endif |
msg.msg_iov = iov; |
- msg.msg_iovlen = kIovSize; |
+ msg.msg_iovlen = kCrashIovSize; |
msg.msg_control = control; |
msg.msg_controllen = kControlMsgSize; |
@@ -346,6 +351,8 @@ void CrashHandlerHostLinux::OnFileCanReadWithoutBlocking(int fd) { |
info->upload = (getenv(env_vars::kHeadless) == NULL); |
#endif |
+ info->crash_keys = crash_keys; |
+ |
#if defined(ADDRESS_SANITIZER) |
info->asan_report_str = asan_report_str_; |
info->asan_report_length = strlen(asan_report_str_); |