Chromium Code Reviews| Index: chrome/app/breakpad_linux.cc |
| =================================================================== |
| --- chrome/app/breakpad_linux.cc (revision 74906) |
| +++ chrome/app/breakpad_linux.cc (working copy) |
| @@ -1,4 +1,4 @@ |
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| @@ -50,6 +50,7 @@ |
| static bool is_crash_reporter_enabled = false; |
| static uint64_t process_start_time = 0; |
| +static char* crash_log_path = NULL; |
| // Writes the value |v| as 16 hex characters to the memory pointed at by |
| // |output|. |
| @@ -541,11 +542,31 @@ |
| const int len = HANDLE_EINTR(sys_read(fds[0], id_buf, |
| sizeof(id_buf) - 1)); |
| if (len > 0) { |
| + // Write crash dump id to stderr. |
| id_buf[len] = 0; |
| static const char msg[] = "\nCrash dump id: "; |
| sys_write(2, msg, sizeof(msg) - 1); |
| sys_write(2, id_buf, my_strlen(id_buf)); |
| sys_write(2, "\n", 1); |
| + |
| + // Write crash dump id to crash log as: seconds_since_epoch,crash_id |
| + struct kernel_timeval tv; |
| + if (!sys_gettimeofday(&tv, NULL)) { |
| + uint64_t time = kernel_timeval_to_ms(&tv); |
| + char time_str[21]; |
| + const unsigned time_len = my_uint64_len(time); |
| + my_uint64tos(time_str, time, time_len); |
| + |
| + int log_fd = sys_open(crash_log_path, O_CREAT | O_WRONLY | O_APPEND, |
| + 0600); |
| + if (log_fd > 0) { |
| + sys_write(log_fd, time_str, time_len); |
| + sys_write(log_fd, ",", 1); |
| + sys_write(log_fd, id_buf, my_strlen(id_buf)); |
| + sys_write(log_fd, "\n", 1); |
| + IGNORE_RET(sys_close(log_fd)); |
| + } |
| + } |
| } |
| IGNORE_RET(sys_unlink(info.filename)); |
| IGNORE_RET(sys_unlink(temp_file)); |
| @@ -634,14 +655,26 @@ |
| void EnableCrashDumping(const bool unattended) { |
| is_crash_reporter_enabled = true; |
| + |
| + FilePath tmp_path("/tmp"); |
|
agl
2011/02/15 14:33:52
We certainly can't write files like this into /tmp
Lei Zhang
2011/02/15 20:29:48
DIR_CRASH_DUMPS is relative to DIR_USER_DATA. If a
agl
2011/02/15 20:34:14
In the case that we can't get DIR_CRASH_DUMPS, I t
|
| + PathService::Get(base::DIR_TEMP, &tmp_path); |
| + |
| + FilePath dumps_path(tmp_path); |
| + PathService::Get(chrome::DIR_CRASH_DUMPS, &dumps_path); |
| + |
| + FilePath logfile = dumps_path.AppendASCII("uploads.log"); |
| + std::string logfile_str = logfile.value(); |
| + const size_t crash_log_path_len = logfile_str.size() + 1; |
| + crash_log_path = new char[crash_log_path_len]; |
| + strncpy(crash_log_path, logfile_str.c_str(), crash_log_path_len); |
| + |
| if (unattended) { |
| - FilePath dumps_path("/tmp"); |
| - PathService::Get(chrome::DIR_CRASH_DUMPS, &dumps_path); |
| new google_breakpad::ExceptionHandler(dumps_path.value().c_str(), NULL, |
| CrashDoneNoUpload, NULL, |
| true /* install handlers */); |
| } else { |
| - new google_breakpad::ExceptionHandler("/tmp", NULL, CrashDoneUpload, NULL, |
| + new google_breakpad::ExceptionHandler(tmp_path.value().c_str(), NULL, |
| + CrashDoneUpload, NULL, |
| true /* install handlers */); |
| } |
| } |