Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(146)

Side by Side Diff: chrome/app/breakpad_linux.cc

Issue 10908115: Always drop a tombstone (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « build/common.gypi ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // For linux_syscall_support.h. This makes it safe to call embedded system 5 // For linux_syscall_support.h. This makes it safe to call embedded system
6 // calls when in seccomp mode. 6 // calls when in seccomp mode.
7 #define SYS_SYSCALL_ENTRYPOINT "playground$syscallEntryPoint" 7 #define SYS_SYSCALL_ENTRYPOINT "playground$syscallEntryPoint"
8 8
9 #include "chrome/app/breakpad_linux.h" 9 #include "chrome/app/breakpad_linux.h"
10 10
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 const char kGoogleBreakpad[] = "google-breakpad"; 369 const char kGoogleBreakpad[] = "google-breakpad";
370 370
371 size_t WriteLog(const char* buf, size_t nbytes) { 371 size_t WriteLog(const char* buf, size_t nbytes) {
372 #if defined(OS_ANDROID) 372 #if defined(OS_ANDROID)
373 return __android_log_write(ANDROID_LOG_WARN, kGoogleBreakpad, buf); 373 return __android_log_write(ANDROID_LOG_WARN, kGoogleBreakpad, buf);
374 #else 374 #else
375 return sys_write(2, buf, nbytes); 375 return sys_write(2, buf, nbytes);
376 #endif 376 #endif
377 } 377 }
378 378
379 #if defined(OS_ANDROID)
380 // Android's native crash handler outputs a diagnostic tombstone to the device
381 // log. By returning false from the HandlerCallbacks, breakpad will reinstall
382 // the previous (i.e. native) signal handlers before returning from its own
383 // handler. A Chrome build fingerprint is written to the log, so that the
384 // specific build of Chrome and the location of the archived Chrome symbols can
385 // be determined directly from it.
386 bool FinalizeCrashDoneAndroid() {
387 base::android::BuildInfo* android_build_info =
388 base::android::BuildInfo::GetInstance();
389
390 __android_log_write(ANDROID_LOG_WARN, kGoogleBreakpad,
391 "### ### ### ### ### ### ### ### ### ### ### ### ###");
392 __android_log_write(ANDROID_LOG_WARN, kGoogleBreakpad,
393 "Chrome build fingerprint:");
394 __android_log_write(ANDROID_LOG_WARN, kGoogleBreakpad,
395 android_build_info->package_version_name());
396 __android_log_write(ANDROID_LOG_WARN, kGoogleBreakpad,
397 android_build_info->package_version_code());
398 __android_log_write(ANDROID_LOG_WARN, kGoogleBreakpad,
399 CHROME_SYMBOLS_ID);
400 __android_log_write(ANDROID_LOG_WARN, kGoogleBreakpad,
401 "### ### ### ### ### ### ### ### ### ### ### ### ###");
402 return false;
403 }
404
405 bool CrashDoneNonBrowserAndroid(const MinidumpDescriptor& minidump,
406 void* context,
407 bool succeeded) {
408 return FinalizeCrashDoneAndroid();
409 }
410 #endif
379 411
380 bool CrashDone(const MinidumpDescriptor& minidump, 412 bool CrashDone(const MinidumpDescriptor& minidump,
381 const bool upload, 413 const bool upload,
382 const bool succeeded) { 414 const bool succeeded) {
383 // WARNING: this code runs in a compromised context. It may not call into 415 // WARNING: this code runs in a compromised context. It may not call into
384 // libc nor allocate memory normally. 416 // libc nor allocate memory normally.
385 if (!succeeded) 417 if (!succeeded)
386 return false; 418 return false;
387 419
388 DCHECK(!minidump.IsFD()); 420 DCHECK(!minidump.IsFD());
(...skipping 15 matching lines...) Expand all
404 info.crash_url_length = 0; 436 info.crash_url_length = 0;
405 info.guid = child_process_logging::g_client_id; 437 info.guid = child_process_logging::g_client_id;
406 info.guid_length = my_strlen(child_process_logging::g_client_id); 438 info.guid_length = my_strlen(child_process_logging::g_client_id);
407 info.distro = base::g_linux_distro; 439 info.distro = base::g_linux_distro;
408 info.distro_length = my_strlen(base::g_linux_distro); 440 info.distro_length = my_strlen(base::g_linux_distro);
409 info.upload = upload; 441 info.upload = upload;
410 info.process_start_time = g_process_start_time; 442 info.process_start_time = g_process_start_time;
411 info.oom_size = base::g_oom_size; 443 info.oom_size = base::g_oom_size;
412 info.pid = 0; 444 info.pid = 0;
413 HandleCrashDump(info); 445 HandleCrashDump(info);
446 #if defined(OS_ANDROID)
447 return FinalizeCrashDoneAndroid();
448 #else
414 return true; 449 return true;
450 #endif
415 } 451 }
416 452
417 // Wrapper function, do not add more code here. 453 // Wrapper function, do not add more code here.
418 bool CrashDoneNoUpload(const MinidumpDescriptor& minidump, 454 bool CrashDoneNoUpload(const MinidumpDescriptor& minidump,
419 void* context, 455 void* context,
420 bool succeeded) { 456 bool succeeded) {
421 return CrashDone(minidump, false, succeeded); 457 return CrashDone(minidump, false, succeeded);
422 } 458 }
423 459
424 #if !defined(OS_ANDROID) 460 #if !defined(OS_ANDROID)
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
571 IGNORE_RET(sys_close(fds[1])); 607 IGNORE_RET(sys_close(fds[1]));
572 return false; 608 return false;
573 } 609 }
574 IGNORE_RET(sys_close(fds[1])); 610 IGNORE_RET(sys_close(fds[1]));
575 611
576 if (HANDLE_EINTR(sys_read(fds[0], &b, 1)) != 1) { 612 if (HANDLE_EINTR(sys_read(fds[0], &b, 1)) != 1) {
577 static const char errmsg[] = "Parent failed to complete crash dump.\n"; 613 static const char errmsg[] = "Parent failed to complete crash dump.\n";
578 WriteLog(errmsg, sizeof(errmsg)-1); 614 WriteLog(errmsg, sizeof(errmsg)-1);
579 } 615 }
580 616
617 #if defined(OS_ANDROID)
618 // When false is returned, breakpad will continue to its minidump generator
619 // and then to the HandlerCallback, which, in this case, is
620 // CrashDoneNonBrowserAndroid().
621 return false;
622 #else
581 return true; 623 return true;
624 #endif
582 } 625 }
583 626
584 void EnableNonBrowserCrashDumping() { 627 void EnableNonBrowserCrashDumping() {
585 const int fd = base::GlobalDescriptors::GetInstance()->Get(kCrashDumpSignal); 628 const int fd = base::GlobalDescriptors::GetInstance()->Get(kCrashDumpSignal);
586 g_is_crash_reporter_enabled = true; 629 g_is_crash_reporter_enabled = true;
587 // We deliberately leak this object. 630 // We deliberately leak this object.
588 DCHECK(!g_breakpad); 631 DCHECK(!g_breakpad);
632
633 ExceptionHandler::MinidumpCallback crash_done_callback = NULL;
634 #if defined(OS_ANDROID)
635 crash_done_callback = CrashDoneNonBrowserAndroid;
636 #endif
637
589 g_breakpad = new ExceptionHandler( 638 g_breakpad = new ExceptionHandler(
590 MinidumpDescriptor("/tmp"), // Unused but needed or Breakpad will assert. 639 MinidumpDescriptor("/tmp"), // Unused but needed or Breakpad will assert.
591 NULL, 640 NULL,
592 NULL, 641 crash_done_callback,
593 reinterpret_cast<void*>(fd), // Param passed to the crash handler. 642 reinterpret_cast<void*>(fd), // Param passed to the crash handler.
594 true, 643 true,
595 -1); 644 -1);
596 g_breakpad->set_crash_handler(NonBrowserCrashHandler); 645 g_breakpad->set_crash_handler(NonBrowserCrashHandler);
597 } 646 }
598 647
599 } // namespace 648 } // namespace
600 649
601 void LoadDataFromFile(google_breakpad::PageAllocator& allocator, 650 void LoadDataFromFile(google_breakpad::PageAllocator& allocator,
602 const BreakpadInfo& info, const char* filename, 651 const BreakpadInfo& info, const char* filename,
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after
1253 logging::SetDumpWithoutCrashingFunction(&DumpProcess); 1302 logging::SetDumpWithoutCrashingFunction(&DumpProcess);
1254 #if defined(ADDRESS_SANITIZER) 1303 #if defined(ADDRESS_SANITIZER)
1255 // Register the callback for AddressSanitizer error reporting. 1304 // Register the callback for AddressSanitizer error reporting.
1256 __asan_set_error_report_callback(AsanLinuxBreakpadCallback); 1305 __asan_set_error_report_callback(AsanLinuxBreakpadCallback);
1257 #endif 1306 #endif
1258 } 1307 }
1259 1308
1260 bool IsCrashReporterEnabled() { 1309 bool IsCrashReporterEnabled() {
1261 return g_is_crash_reporter_enabled; 1310 return g_is_crash_reporter_enabled;
1262 } 1311 }
OLDNEW
« no previous file with comments | « build/common.gypi ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698