| Index: components/crash/content/app/crashpad.cc
|
| diff --git a/components/crash/content/app/crashpad_mac.mm b/components/crash/content/app/crashpad.cc
|
| similarity index 68%
|
| copy from components/crash/content/app/crashpad_mac.mm
|
| copy to components/crash/content/app/crashpad.cc
|
| index f87fc96ee46b38368faef8c69ce21cf6ac2752a8..e3b4124affd8182b1d160d42f109363bab717612 100644
|
| --- a/components/crash/content/app/crashpad_mac.mm
|
| +++ b/components/crash/content/app/crashpad.cc
|
| @@ -2,26 +2,24 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "components/crash/content/app/crashpad_mac.h"
|
| +#include "components/crash/content/app/crashpad.h"
|
|
|
| #include <string.h>
|
| -#include <unistd.h>
|
|
|
| #include <algorithm>
|
| #include <map>
|
| #include <vector>
|
|
|
| #include "base/auto_reset.h"
|
| +#include "base/command_line.h"
|
| #include "base/debug/crash_logging.h"
|
| #include "base/debug/dump_without_crashing.h"
|
| -#include "base/files/file_path.h"
|
| #include "base/logging.h"
|
| -#include "base/mac/bundle_locations.h"
|
| -#include "base/mac/foundation_util.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/string_piece.h"
|
| #include "base/strings/stringprintf.h"
|
| #include "base/strings/sys_string_conversions.h"
|
| +#include "build/build_config.h"
|
| #include "components/crash/content/app/crash_reporter_client.h"
|
| #include "third_party/crashpad/crashpad/client/crash_report_database.h"
|
| #include "third_party/crashpad/crashpad/client/crashpad_client.h"
|
| @@ -30,6 +28,10 @@
|
| #include "third_party/crashpad/crashpad/client/simple_string_dictionary.h"
|
| #include "third_party/crashpad/crashpad/client/simulate_crash.h"
|
|
|
| +#if defined(OS_POSIX)
|
| +#include <unistd.h>
|
| +#endif // OS_POSIX
|
| +
|
| namespace crash_reporter {
|
|
|
| namespace {
|
| @@ -74,6 +76,7 @@ bool LogMessageHandler(int severity,
|
| }
|
| }
|
|
|
| + CHECK_LE(message_start, string.size());
|
| std::string message = base::StringPrintf("%s:%d: %s", file, line,
|
| string.c_str() + message_start);
|
| SetCrashKeyValue("LOG_FATAL", message);
|
| @@ -98,79 +101,26 @@ void InitializeCrashpad(bool initial_client, const std::string& process_type) {
|
| CrashReporterClient* crash_reporter_client = GetCrashReporterClient();
|
|
|
| if (initial_client) {
|
| +#if defined(OS_MACOSX)
|
| // "relauncher" is hard-coded because it's a Chrome --type, but this
|
| // component can't see Chrome's switches. This is only used for argument
|
| // sanitization.
|
| DCHECK(browser_process || process_type == "relauncher");
|
| +#else
|
| + DCHECK(browser_process);
|
| +#endif // OS_MACOSX
|
| } else {
|
| DCHECK(!browser_process);
|
| }
|
|
|
| - base::FilePath database_path; // Only valid in the browser process.
|
| -
|
| - if (initial_client) {
|
| - @autoreleasepool {
|
| - base::FilePath framework_bundle_path = base::mac::FrameworkBundlePath();
|
| - base::FilePath handler_path =
|
| - framework_bundle_path.Append("Helpers").Append("crashpad_handler");
|
| -
|
| - // Is there a way to recover if this fails?
|
| - crash_reporter_client->GetCrashDumpLocation(&database_path);
|
| -
|
| - // TODO(mark): Reading the Breakpad keys is temporary and transitional. At
|
| - // the very least, they should be renamed to Crashpad. For the time being,
|
| - // this isn't the worst thing: Crashpad is still uploading to a
|
| - // Breakpad-type server, after all.
|
| - NSBundle* framework_bundle = base::mac::FrameworkBundle();
|
| - NSString* product = base::mac::ObjCCast<NSString>(
|
| - [framework_bundle objectForInfoDictionaryKey:@"BreakpadProduct"]);
|
| - NSString* version = base::mac::ObjCCast<NSString>(
|
| - [framework_bundle objectForInfoDictionaryKey:@"BreakpadVersion"]);
|
| - NSString* url_ns = base::mac::ObjCCast<NSString>(
|
| - [framework_bundle objectForInfoDictionaryKey:@"BreakpadURL"]);
|
| -
|
| - std::string url = base::SysNSStringToUTF8(url_ns);
|
| -
|
| - std::map<std::string, std::string> process_annotations;
|
| - process_annotations["prod"] = base::SysNSStringToUTF8(product);
|
| - process_annotations["ver"] = base::SysNSStringToUTF8(version);
|
| - process_annotations["plat"] = std::string("OS X");
|
| -
|
| - crashpad::CrashpadClient crashpad_client;
|
| -
|
| - std::vector<std::string> arguments;
|
| - if (!browser_process) {
|
| - // If this is an initial client that's not the browser process, it's
|
| - // important that the new Crashpad handler also not be connected to any
|
| - // existing handler. This argument tells the new Crashpad handler to
|
| - // sever this connection.
|
| - arguments.push_back(
|
| - "--reset-own-crash-exception-port-to-system-default");
|
| - }
|
| -
|
| - bool result = crashpad_client.StartHandler(handler_path,
|
| - database_path,
|
| - url,
|
| - process_annotations,
|
| - arguments,
|
| - true);
|
| - if (result) {
|
| - result = crashpad_client.UseHandler();
|
| - }
|
| -
|
| - // If this is an initial client that's not the browser process, it's
|
| - // important to sever the connection to any existing handler. If
|
| - // StartHandler() or UseHandler() failed, call UseSystemDefaultHandler()
|
| - // in that case to drop the link to the existing handler.
|
| - if (!result && !browser_process) {
|
| - crashpad::CrashpadClient::UseSystemDefaultHandler();
|
| - }
|
| - } // @autoreleasepool
|
| - }
|
| + // database_path is only valid in the browser process.
|
| + base::FilePath database_path =
|
| + internal::PlatformCrashpadInitialization(initial_client, browser_process);
|
|
|
| crashpad::CrashpadInfo* crashpad_info =
|
| crashpad::CrashpadInfo::GetCrashpadInfo();
|
|
|
| +#if defined(OS_MACOSX)
|
| #if defined(NDEBUG)
|
| const bool is_debug_build = false;
|
| #else
|
| @@ -188,6 +138,7 @@ void InitializeCrashpad(bool initial_client, const std::string& process_type) {
|
| crashpad_info->set_system_crash_reporter_forwarding(
|
| crashpad::TriState::kDisabled);
|
| }
|
| +#endif // OS_MACOSX
|
|
|
| g_simple_string_dictionary = new crashpad::SimpleStringDictionary();
|
| crashpad_info->set_simple_annotations(g_simple_string_dictionary);
|
| @@ -197,7 +148,11 @@ void InitializeCrashpad(bool initial_client, const std::string& process_type) {
|
|
|
| SetCrashKeyValue("ptype", browser_process ? base::StringPiece("browser")
|
| : base::StringPiece(process_type));
|
| +#if defined(OS_POSIX)
|
| SetCrashKeyValue("pid", base::IntToString(getpid()));
|
| +#elif defined(OS_WIN)
|
| + SetCrashKeyValue("pid", base::IntToString(::GetCurrentProcessId()));
|
| +#endif
|
|
|
| logging::SetLogMessageHandler(LogMessageHandler);
|
|
|
| @@ -272,12 +227,10 @@ void GetUploadedReports(std::vector<UploadedReport>* uploaded_reports) {
|
| }
|
| }
|
|
|
| - struct {
|
| - bool operator()(const UploadedReport& a, const UploadedReport& b) {
|
| - return a.creation_time >= b.creation_time;
|
| - }
|
| - } sort_by_time;
|
| - std::sort(uploaded_reports->begin(), uploaded_reports->end(), sort_by_time);
|
| + std::sort(uploaded_reports->begin(), uploaded_reports->end(),
|
| + [](const UploadedReport& a, const UploadedReport& b) {
|
| + return a.creation_time >= b.creation_time;
|
| + });
|
| }
|
|
|
| } // namespace crash_reporter
|
|
|