| Index: chrome/app/breakpad_linuxish.cc
|
| ===================================================================
|
| --- chrome/app/breakpad_linuxish.cc (revision 133521)
|
| +++ chrome/app/breakpad_linuxish.cc (working copy)
|
| @@ -46,13 +46,22 @@
|
| #if defined(OS_ANDROID)
|
| #include <android/log.h>
|
| #include <sys/stat.h>
|
| +
|
| +#include "base/android/build_info.h"
|
| #include "base/android/path_utils.h"
|
| -#include "base/android/build_info.h"
|
| #include "third_party/lss/linux_syscall_support.h"
|
| #else
|
| #include "seccompsandbox/linux_syscall_support.h"
|
| #endif
|
|
|
| +#if defined(OS_ANDROID)
|
| +#define STAT_STRUCT struct stat
|
| +#define FSTAT_FUNC fstat
|
| +#else
|
| +#define STAT_STRUCT struct kernel_stat
|
| +#define FSTAT_FUNC sys_fstat
|
| +#endif
|
| +
|
| #ifndef PR_SET_PTRACER
|
| #define PR_SET_PTRACER 0x59616d61
|
| #endif
|
| @@ -144,8 +153,8 @@
|
| return dst;
|
| }
|
|
|
| -static char* my_strncat(char *dest, const char *src, size_t len) {
|
| - char *ret = dest;
|
| +static char* my_strncat(char *dest, const char* src, size_t len) {
|
| + char* ret = dest;
|
| while (*dest)
|
| dest++;
|
| while (len--)
|
| @@ -159,13 +168,12 @@
|
| namespace {
|
|
|
| // MIME substrings.
|
| -static const char g_rn[] = "\r\n";
|
| -static const char g_form_data_msg[] = "Content-Disposition: form-data; name=\"";
|
| -static const char g_quote_msg[] = "\"";
|
| -static const char g_dashdash_msg[] = "--";
|
| -static const char g_dump_msg[] = "upload_file_minidump\"; filename=\"dump\"";
|
| -static const char g_content_type_msg[] =
|
| - "Content-Type: application/octet-stream";
|
| +const char g_rn[] = "\r\n";
|
| +const char g_form_data_msg[] = "Content-Disposition: form-data; name=\"";
|
| +const char g_quote_msg[] = "\"";
|
| +const char g_dashdash_msg[] = "--";
|
| +const char g_dump_msg[] = "upload_file_minidump\"; filename=\"dump\"";
|
| +const char g_content_type_msg[] = "Content-Type: application/octet-stream";
|
|
|
| // MimeWriter manages an iovec for writing MIMEs to a file.
|
| class MimeWriter {
|
| @@ -343,9 +351,11 @@
|
| g_breakpad->WriteMinidump();
|
| }
|
|
|
| +const char kGoogleBreakpad[] = "google-breakpad";
|
| +
|
| size_t WriteLog(const char* buf, size_t nbytes) {
|
| #if defined(OS_ANDROID)
|
| - return __android_log_write(ANDROID_LOG_WARN, "google-breakpad", buf);
|
| + return __android_log_write(ANDROID_LOG_WARN, kGoogleBreakpad, buf);
|
| #else
|
| return sys_write(2, buf, nbytes);
|
| #endif
|
| @@ -363,13 +373,8 @@
|
| WriteLog(msg, sizeof(msg));
|
| return;
|
| }
|
| -#if defined(OS_ANDROID)
|
| - struct stat st;
|
| - if (fstat(dumpfd, &st) != 0) {
|
| -#else
|
| - struct kernel_stat st;
|
| - if (sys_fstat(dumpfd, &st) != 0) {
|
| -#endif
|
| + STAT_STRUCT st;
|
| + if (FSTAT_FUNC(dumpfd, &st) != 0) {
|
| static const char msg[] = "Cannot upload crash dump: stat failed\n";
|
| WriteLog(msg, sizeof(msg));
|
| IGNORE_RET(sys_close(dumpfd));
|
| @@ -540,11 +545,6 @@
|
| base::android::BuildInfo::GetInstance();
|
| static const char* version_msg =
|
| android_build_info->package_version_code();
|
| - static const char android_build_id[] = "android_build_id";
|
| - static const char android_build_fp[] = "android_build_fp";
|
| - static const char device[] = "device";
|
| - static const char model[] = "model";
|
| - static const char brand[] = "brand";
|
| #else
|
| static const char version_msg[] = PRODUCT_VERSION;
|
| #endif
|
| @@ -557,14 +557,20 @@
|
| writer.AddPairString("guid", info.guid);
|
| writer.AddBoundary();
|
| if (info.pid > 0) {
|
| + char pid_buf[kUint64StringSize];
|
| uint64_t pid_str_len = my_uint64_len(info.pid);
|
| - char* pid_buf = reinterpret_cast<char*>(allocator.Alloc(pid_str_len));
|
| my_uint64tos(pid_buf, info.pid, pid_str_len);
|
| writer.AddPairString("pid", pid_buf);
|
| writer.AddBoundary();
|
| }
|
| #if defined(OS_ANDROID)
|
| // Addtional MIME blocks are added for logging on Android devices.
|
| + static const char android_build_id[] = "android_build_id";
|
| + static const char android_build_fp[] = "android_build_fp";
|
| + static const char device[] = "device";
|
| + static const char model[] = "model";
|
| + static const char brand[] = "brand";
|
| +
|
| writer.AddPairString(
|
| android_build_id, android_build_info->android_build_id());
|
| writer.AddBoundary();
|
| @@ -725,17 +731,19 @@
|
| writer.Flush();
|
|
|
| IGNORE_RET(sys_close(temp_file_fd));
|
| +
|
| #if defined(OS_ANDROID)
|
| + __android_log_write(ANDROID_LOG_WARN,
|
| + kGoogleBreakpad,
|
| + "Output crash dump file:");
|
| + __android_log_write(ANDROID_LOG_WARN, kGoogleBreakpad, info.filename);
|
| +
|
| + char pid_buf[kUint64StringSize];
|
| uint64_t pid_str_len = my_uint64_len(info.pid);
|
| - char* pid_buf = reinterpret_cast<char*>(allocator.Alloc(pid_str_len));
|
| my_uint64tos(pid_buf, info.pid, pid_str_len);
|
|
|
| - static const char* output_msg = "Output crash dump file:";
|
| - WriteLog(output_msg, my_strlen(output_msg));
|
| - unsigned filename_len = my_strlen(info.filename);
|
| - WriteLog(info.filename, filename_len);
|
| // -1 because we won't need the null terminator on the original filename.
|
| - size_t done_filename_len = filename_len - 1 + pid_str_len;
|
| + size_t done_filename_len = my_strlen(info.filename) + pid_str_len - 1;
|
| char* done_filename = reinterpret_cast<char*>(
|
| allocator.Alloc(done_filename_len));
|
| // Rename the file such that the pid is the suffix in order to signal other
|
| @@ -749,10 +757,10 @@
|
| my_strncat(done_filename, pid_buf, pid_str_len);
|
| // Rename the minidump file to signal that it is complete.
|
| if (rename(info.filename, done_filename)) {
|
| - __android_log_write(ANDROID_LOG_WARN, "chromium", "Failed to rename:");
|
| - __android_log_write(ANDROID_LOG_WARN, "chromium", info.filename);
|
| - __android_log_write(ANDROID_LOG_WARN, "chromium", "to");
|
| - __android_log_write(ANDROID_LOG_WARN, "chromium", done_filename);
|
| + __android_log_write(ANDROID_LOG_WARN, kGoogleBreakpad, "Failed to rename:");
|
| + __android_log_write(ANDROID_LOG_WARN, kGoogleBreakpad, info.filename);
|
| + __android_log_write(ANDROID_LOG_WARN, kGoogleBreakpad, "to");
|
| + __android_log_write(ANDROID_LOG_WARN, kGoogleBreakpad, done_filename);
|
| }
|
| #endif
|
|
|
| @@ -820,7 +828,7 @@
|
| // Wget process.
|
| IGNORE_RET(sys_close(fds[0]));
|
| IGNORE_RET(sys_dup2(fds[1], 3));
|
| - static const char* const kWgetBinary = "/usr/bin/wget";
|
| + static const char kWgetBinary[] = "/usr/bin/wget";
|
| const char* args[] = {
|
| kWgetBinary,
|
| header,
|
| @@ -950,23 +958,23 @@
|
|
|
| // Wrapper function, do not add more code here.
|
| static bool CrashDoneNoUpload(const char* dump_path,
|
| - const char* minidump_id,
|
| - void* context,
|
| - bool succeeded) {
|
| + const char* minidump_id,
|
| + void* context,
|
| + bool succeeded) {
|
| return CrashDone(dump_path, minidump_id, false, succeeded);
|
| }
|
|
|
| #if !defined(OS_ANDROID)
|
| // Wrapper function, do not add more code here.
|
| static bool CrashDoneUpload(const char* dump_path,
|
| - const char* minidump_id,
|
| - void* context,
|
| - bool succeeded) {
|
| + const char* minidump_id,
|
| + void* context,
|
| + bool succeeded) {
|
| return CrashDone(dump_path, minidump_id, true, succeeded);
|
| }
|
| #endif
|
|
|
| -void EnableCrashDumping(bool unattended) {
|
| +static void EnableCrashDumping(bool unattended) {
|
| g_is_crash_reporter_enabled = true;
|
|
|
| FilePath tmp_path("/tmp");
|
| @@ -983,7 +991,7 @@
|
| }
|
| DCHECK(!g_breakpad);
|
| #if defined(OS_ANDROID)
|
| - unattended = true;
|
| + unattended = true; // Android never uploads directly.
|
| #endif
|
| if (unattended) {
|
| g_breakpad = new google_breakpad::ExceptionHandler(
|
| @@ -992,14 +1000,18 @@
|
| CrashDoneNoUpload,
|
| NULL,
|
| true /* install handlers */);
|
| - } else {
|
| - g_breakpad = new google_breakpad::ExceptionHandler(
|
| - tmp_path.value().c_str(),
|
| - NULL,
|
| - CrashDoneUpload,
|
| - NULL,
|
| - true /* install handlers */);
|
| + return;
|
| }
|
| +
|
| +#if !defined(OS_ANDROID)
|
| + // Attended mode
|
| + g_breakpad = new google_breakpad::ExceptionHandler(
|
| + tmp_path.value().c_str(),
|
| + NULL,
|
| + CrashDoneUpload,
|
| + NULL,
|
| + true /* install handlers */);
|
| +#endif
|
| }
|
|
|
| // Non-Browser = Extension, Gpu, Plugins, Ppapi and Renderer
|
| @@ -1101,7 +1113,7 @@
|
| return true;
|
| }
|
|
|
| -void EnableNonBrowserCrashDumping() {
|
| +static void EnableNonBrowserCrashDumping() {
|
| const int fd = base::GlobalDescriptors::GetInstance()->Get(kCrashDumpSignal);
|
| g_is_crash_reporter_enabled = true;
|
| // We deliberately leak this object.
|
|
|