Chromium Code Reviews| Index: chrome/tools/crash_service/crash_service.cc |
| =================================================================== |
| --- chrome/tools/crash_service/crash_service.cc (revision 150982) |
| +++ chrome/tools/crash_service/crash_service.cc (working copy) |
| @@ -14,6 +14,7 @@ |
| #include "base/file_util.h" |
| #include "base/logging.h" |
| #include "base/path_service.h" |
| +#include "base/string_number_conversions.h" |
| #include "base/win/windows_version.h" |
| #include "breakpad/src/client/windows/crash_generation/client_info.h" |
| #include "breakpad/src/client/windows/crash_generation/crash_generation_server.h" |
| @@ -146,12 +147,15 @@ |
| } // namespace |
| // Command line switches: |
| -const char CrashService::kMaxReports[] = "max-reports"; |
| -const char CrashService::kNoWindow[] = "no-window"; |
| -const char CrashService::kReporterTag[] = "reporter"; |
| -const char CrashService::kDumpsDir[] = "dumps-dir"; |
| -const char CrashService::kPipeName[] = "pipe-name"; |
| +const char CrashService::kMaxReports[] = "max-reports"; |
| +const char CrashService::kNoWindow[] = "no-window"; |
| +const char CrashService::kReporterTag[] = "reporter"; |
| +const char CrashService::kDumpsDir[] = "dumps-dir"; |
| +const char CrashService::kPipeName[] = "pipe-name"; |
| +const char CrashService::kArchiveDumpsByPid[] = "archive-dumps-by-pid"; |
| +bool CrashService::archive_dumps_by_pid_ = false; |
|
sky
2012/11/02 15:03:04
// static on the previous line.
|
| + |
| CrashService::CrashService(const std::wstring& report_dir) |
| : report_path_(report_dir), |
| sender_(NULL), |
| @@ -203,6 +207,9 @@ |
| } |
| } |
| + if (cmd_line.HasSwitch(kArchiveDumpsByPid)) |
| + archive_dumps_by_pid_ = true; |
| + |
| // We can override the send reports quota with a command line switch. |
| if (cmd_line.HasSwitch(kMaxReports)) |
| max_reports = _wtoi(cmd_line.GetSwitchValueNative(kMaxReports).c_str()); |
| @@ -371,12 +378,23 @@ |
| LOG(ERROR) << "could not write custom info file"; |
| } |
| + // Move dump file to the directory under client pid. |
| + FilePath dump_path = FilePath(*file_path); |
| + if (archive_dumps_by_pid_) { |
| + FilePath dump_path_with_pid(dump_path.DirName()); |
| + dump_path_with_pid = dump_path_with_pid.Append(base::Int64ToString16(pid)); |
| + file_util::CreateDirectoryW(dump_path_with_pid); |
| + dump_path_with_pid = dump_path_with_pid.Append(dump_path.BaseName()); |
| + file_util::Move(dump_path, dump_path_with_pid); |
| + } |
| + |
| if (!self->sender_) |
| return; |
| // Send the crash dump using a worker thread. This operation has retry |
| // logic in case there is no internet connection at the time. |
| - DumpJobInfo* dump_job = new DumpJobInfo(pid, self, map, *file_path); |
| + DumpJobInfo* dump_job = new DumpJobInfo(pid, self, map, |
| + dump_path.value()); |
| if (!::QueueUserWorkItem(&CrashService::AsyncSendDump, |
| dump_job, WT_EXECUTELONGFUNCTION)) { |
| LOG(ERROR) << "could not queue job"; |