2016-12-12 11:05:29 +01:00
|
|
|
diff --git build/secondary/third_party/crashpad/crashpad/handler/BUILD.gn build/secondary/third_party/crashpad/crashpad/handler/BUILD.gn
|
2017-05-31 17:33:30 +02:00
|
|
|
index 4d385dd..1b51f2d 100644
|
2016-12-12 11:05:29 +01:00
|
|
|
--- build/secondary/third_party/crashpad/crashpad/handler/BUILD.gn
|
|
|
|
+++ build/secondary/third_party/crashpad/crashpad/handler/BUILD.gn
|
|
|
|
@@ -2,6 +2,8 @@
|
|
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
|
|
# found in the LICENSE file.
|
|
|
|
|
|
|
|
+import("//cef/libcef/features/features.gni")
|
|
|
|
+
|
|
|
|
static_library("handler_lib") {
|
|
|
|
sources = [
|
|
|
|
"crash_report_upload_thread.cc",
|
2017-05-31 17:33:30 +02:00
|
|
|
@@ -30,8 +32,18 @@ static_library("handler_lib") {
|
2016-12-12 11:05:29 +01:00
|
|
|
"../snapshot",
|
|
|
|
"../tools:tool_support",
|
|
|
|
"//base",
|
|
|
|
+ "//cef/libcef/features",
|
|
|
|
]
|
|
|
|
|
|
|
|
+ if (enable_cef) {
|
|
|
|
+ sources += [
|
|
|
|
+ "//cef/libcef/common/cef_crash_report_upload_thread.cc",
|
|
|
|
+ "//cef/libcef/common/cef_crash_report_upload_thread.h",
|
|
|
|
+ ]
|
|
|
|
+
|
|
|
|
+ include_dirs += [ "//cef" ]
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
if (is_win) {
|
|
|
|
cflags = [ "/wd4201" ]
|
|
|
|
}
|
|
|
|
diff --git chrome/common/crash_keys.cc chrome/common/crash_keys.cc
|
2017-05-31 17:33:30 +02:00
|
|
|
index e9578be..2561824 100644
|
2016-12-12 11:05:29 +01:00
|
|
|
--- chrome/common/crash_keys.cc
|
|
|
|
+++ chrome/common/crash_keys.cc
|
|
|
|
@@ -4,6 +4,8 @@
|
|
|
|
|
|
|
|
#include "chrome/common/crash_keys.h"
|
|
|
|
|
|
|
|
+#include <iterator>
|
|
|
|
+
|
|
|
|
#include "base/base_switches.h"
|
|
|
|
#include "base/command_line.h"
|
|
|
|
#include "base/format_macros.h"
|
2017-05-31 17:33:30 +02:00
|
|
|
@@ -86,7 +88,7 @@ const char kViewCount[] = "view-count";
|
2016-12-12 11:05:29 +01:00
|
|
|
|
|
|
|
const char kZeroEncodeDetails[] = "zero-encode-details";
|
|
|
|
|
|
|
|
-size_t RegisterChromeCrashKeys() {
|
|
|
|
+void GetChromeCrashKeys(std::vector<base::debug::CrashKey>& keys) {
|
|
|
|
// The following keys may be chunked by the underlying crash logging system,
|
|
|
|
// but ultimately constitute a single key-value pair.
|
|
|
|
//
|
2017-05-31 17:33:30 +02:00
|
|
|
@@ -226,10 +228,16 @@ size_t RegisterChromeCrashKeys() {
|
2016-12-12 11:05:29 +01:00
|
|
|
|
|
|
|
// This dynamic set of keys is used for sets of key value pairs when gathering
|
|
|
|
// a collection of data, like command line switches or extension IDs.
|
|
|
|
- std::vector<base::debug::CrashKey> keys(
|
|
|
|
- fixed_keys, fixed_keys + arraysize(fixed_keys));
|
|
|
|
+ keys.reserve(keys.size() + arraysize(fixed_keys));
|
|
|
|
+ std::copy(fixed_keys, fixed_keys + arraysize(fixed_keys),
|
|
|
|
+ std::back_inserter(keys));
|
|
|
|
|
|
|
|
crash_keys::GetCrashKeysForCommandLineSwitches(&keys);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+size_t RegisterChromeCrashKeys() {
|
|
|
|
+ std::vector<base::debug::CrashKey> keys;
|
|
|
|
+ GetChromeCrashKeys(keys);
|
|
|
|
|
|
|
|
// Register the extension IDs.
|
|
|
|
{
|
2017-05-31 17:33:30 +02:00
|
|
|
@@ -263,7 +271,7 @@ size_t RegisterChromeCrashKeys() {
|
2016-12-12 11:05:29 +01:00
|
|
|
return base::debug::InitCrashKeys(&keys.at(0), keys.size(), kChunkMaxLength);
|
|
|
|
}
|
|
|
|
|
|
|
|
-static bool IsBoringSwitch(const std::string& flag) {
|
|
|
|
+bool IsBoringChromeSwitch(const std::string& flag) {
|
|
|
|
static const char* const kIgnoreSwitches[] = {
|
|
|
|
switches::kEnableLogging,
|
|
|
|
switches::kFlagSwitchesBegin,
|
2017-05-31 17:33:30 +02:00
|
|
|
@@ -319,7 +327,7 @@ static bool IsBoringSwitch(const std::string& flag) {
|
2016-12-12 11:05:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void SetCrashKeysFromCommandLine(const base::CommandLine& command_line) {
|
|
|
|
- return SetSwitchesFromCommandLine(command_line, &IsBoringSwitch);
|
|
|
|
+ return SetSwitchesFromCommandLine(command_line, &IsBoringChromeSwitch);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SetActiveExtensions(const std::set<std::string>& extensions) {
|
|
|
|
diff --git chrome/common/crash_keys.h chrome/common/crash_keys.h
|
2017-05-31 17:33:30 +02:00
|
|
|
index 93fb0b0..3e543d2 100644
|
2016-12-12 11:05:29 +01:00
|
|
|
--- chrome/common/crash_keys.h
|
|
|
|
+++ chrome/common/crash_keys.h
|
2017-03-03 23:37:23 +01:00
|
|
|
@@ -22,10 +22,18 @@ class CommandLine;
|
2016-12-12 11:05:29 +01:00
|
|
|
|
|
|
|
namespace crash_keys {
|
|
|
|
|
|
|
|
+// Returns the list of potential crash keys that can be sent to the crash
|
|
|
|
+// server.
|
|
|
|
+void GetChromeCrashKeys(std::vector<base::debug::CrashKey>& keys);
|
|
|
|
+
|
|
|
|
// Registers all of the potential crash keys that can be sent to the crash
|
|
|
|
// reporting server. Returns the size of the union of all keys.
|
|
|
|
size_t RegisterChromeCrashKeys();
|
|
|
|
|
|
|
|
+// Returns true if the specified command-line flag should be excluded from
|
|
|
|
+// crash reporting.
|
|
|
|
+bool IsBoringChromeSwitch(const std::string& flag);
|
|
|
|
+
|
|
|
|
// Sets the kNumSwitches key and the set of keys named using kSwitchFormat based
|
|
|
|
// on the given |command_line|.
|
|
|
|
void SetCrashKeysFromCommandLine(const base::CommandLine& command_line);
|
|
|
|
diff --git chrome_elf/BUILD.gn chrome_elf/BUILD.gn
|
2017-05-31 17:33:30 +02:00
|
|
|
index c8197e9..21ad726 100644
|
2016-12-12 11:05:29 +01:00
|
|
|
--- chrome_elf/BUILD.gn
|
|
|
|
+++ chrome_elf/BUILD.gn
|
|
|
|
@@ -7,6 +7,7 @@
|
|
|
|
|
|
|
|
import("//build/config/compiler/compiler.gni")
|
|
|
|
import("//build/config/win/manifest.gni")
|
|
|
|
+import("//cef/libcef/features/features.gni")
|
|
|
|
import("//chrome/process_version_rc_template.gni")
|
|
|
|
import("//testing/test.gni")
|
|
|
|
|
2017-04-20 21:28:17 +02:00
|
|
|
@@ -137,16 +138,40 @@ static_library("blacklist") {
|
2016-12-12 11:05:29 +01:00
|
|
|
|
|
|
|
static_library("crash") {
|
|
|
|
sources = [
|
|
|
|
- "../chrome/app/chrome_crash_reporter_client_win.cc",
|
|
|
|
- "../chrome/app/chrome_crash_reporter_client_win.h",
|
|
|
|
- "../chrome/common/chrome_result_codes.h",
|
|
|
|
"crash/crash_helper.cc",
|
|
|
|
"crash/crash_helper.h",
|
|
|
|
]
|
|
|
|
+
|
|
|
|
+ if (enable_cef) {
|
|
|
|
+ sources += [
|
|
|
|
+ "//cef/libcef/common/crash_reporter_client.cc",
|
|
|
|
+ "//cef/libcef/common/crash_reporter_client.h",
|
|
|
|
+
|
|
|
|
+ # Required for crash_keys::GetChromeCrashKeys.
|
|
|
|
+ # Otherwise we need to copy this array into CEF, which would be difficult
|
|
|
|
+ # to maintain.
|
|
|
|
+ "//chrome/common/crash_keys.cc",
|
|
|
|
+ "//chrome/common/chrome_switches.cc",
|
|
|
|
+ "//components/flags_ui/flags_ui_switches.cc",
|
|
|
|
+ "//content/public/common/content_switches.cc",
|
2017-04-20 21:28:17 +02:00
|
|
|
+ "//gpu/config/gpu_crash_keys.cc",
|
2016-12-12 11:05:29 +01:00
|
|
|
+ ]
|
|
|
|
+ include_dirs = [
|
|
|
|
+ "//cef",
|
|
|
|
+ ]
|
|
|
|
+ } else {
|
|
|
|
+ sources += [
|
|
|
|
+ "//chrome/app/chrome_crash_reporter_client_win.cc",
|
|
|
|
+ "//chrome/app/chrome_crash_reporter_client_win.h",
|
|
|
|
+ "//chrome/common/chrome_result_codes.h",
|
|
|
|
+ ]
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
deps = [
|
|
|
|
":hook_util",
|
|
|
|
"//base:base", # This needs to go. DEP of app, crash_keys, client.
|
|
|
|
"//base:base_static", # pe_image
|
|
|
|
+ "//cef/libcef/features",
|
|
|
|
"//chrome/install_static:install_static_util",
|
|
|
|
"//components/crash/content/app:app",
|
|
|
|
"//components/crash/core/common", # crash_keys
|
|
|
|
diff --git chrome_elf/crash/crash_helper.cc chrome_elf/crash/crash_helper.cc
|
|
|
|
index c658fa9..8c4a145 100644
|
|
|
|
--- chrome_elf/crash/crash_helper.cc
|
|
|
|
+++ chrome_elf/crash/crash_helper.cc
|
|
|
|
@@ -11,12 +11,17 @@
|
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
+#include "cef/libcef/features/features.h"
|
|
|
|
#include "chrome/app/chrome_crash_reporter_client_win.h"
|
|
|
|
#include "chrome_elf/hook_util/hook_util.h"
|
|
|
|
#include "components/crash/content/app/crashpad.h"
|
|
|
|
#include "components/crash/core/common/crash_keys.h"
|
|
|
|
#include "third_party/crashpad/crashpad/client/crashpad_client.h"
|
|
|
|
|
|
|
|
+#if BUILDFLAG(ENABLE_CEF)
|
|
|
|
+#include "cef/libcef/common/crash_reporter_client.h"
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
// Crash handling from elf is only enabled for the chrome.exe process.
|
|
|
|
@@ -74,7 +79,11 @@ bool InitializeCrashReporting() {
|
|
|
|
g_crash_reports = new std::vector<crash_reporter::Report>;
|
|
|
|
g_set_unhandled_exception_filter = new elf_hook::IATHook();
|
|
|
|
|
|
|
|
+#if BUILDFLAG(ENABLE_CEF)
|
|
|
|
+ CefCrashReporterClient::InitializeCrashReportingForProcess();
|
|
|
|
+#else
|
|
|
|
ChromeCrashReporterClient::InitializeCrashReportingForProcess();
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
g_crash_helper_enabled = true;
|
|
|
|
return true;
|
|
|
|
diff --git components/crash/content/app/breakpad_linux.cc components/crash/content/app/breakpad_linux.cc
|
2017-04-20 21:28:17 +02:00
|
|
|
index 0d3de65..a1b8b09 100644
|
2016-12-12 11:05:29 +01:00
|
|
|
--- components/crash/content/app/breakpad_linux.cc
|
|
|
|
+++ components/crash/content/app/breakpad_linux.cc
|
|
|
|
@@ -29,6 +29,7 @@
|
|
|
|
#include "base/command_line.h"
|
|
|
|
#include "base/debug/crash_logging.h"
|
|
|
|
#include "base/debug/dump_without_crashing.h"
|
|
|
|
+#include "base/debug/leak_annotations.h"
|
|
|
|
#include "base/files/file_path.h"
|
|
|
|
#include "base/lazy_instance.h"
|
|
|
|
#include "base/linux_util.h"
|
|
|
|
@@ -89,6 +90,7 @@ namespace {
|
|
|
|
|
|
|
|
#if !defined(OS_CHROMEOS)
|
|
|
|
const char kUploadURL[] = "https://clients2.google.com/cr/report";
|
|
|
|
+const char* g_crash_server_url = kUploadURL;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
bool g_is_crash_reporter_enabled = false;
|
2017-04-20 21:28:17 +02:00
|
|
|
@@ -688,7 +690,7 @@ bool CrashDone(const MinidumpDescriptor& minidump,
|
2016-12-12 11:05:29 +01:00
|
|
|
info.process_type_length = 7;
|
|
|
|
info.distro = base::g_linux_distro;
|
|
|
|
info.distro_length = my_strlen(base::g_linux_distro);
|
|
|
|
- info.upload = upload;
|
|
|
|
+ info.upload = upload && g_crash_server_url;
|
|
|
|
info.process_start_time = g_process_start_time;
|
|
|
|
info.oom_size = base::g_oom_size;
|
|
|
|
info.pid = g_pid;
|
2017-04-20 21:28:17 +02:00
|
|
|
@@ -1357,7 +1359,7 @@ void ExecUploadProcessOrTerminate(const BreakpadInfo& info,
|
2016-12-12 11:05:29 +01:00
|
|
|
header_content_encoding,
|
|
|
|
header_content_type,
|
|
|
|
post_file,
|
|
|
|
- kUploadURL,
|
|
|
|
+ g_crash_server_url,
|
|
|
|
"--timeout=10", // Set a timeout so we don't hang forever.
|
|
|
|
"--tries=1", // Don't retry if the upload fails.
|
2017-03-03 23:37:23 +01:00
|
|
|
"-O", // Output reply to the file descriptor path.
|
2017-04-20 21:28:17 +02:00
|
|
|
@@ -1696,10 +1698,19 @@ void HandleCrashDump(const BreakpadInfo& info) {
|
2017-01-25 19:37:12 +01:00
|
|
|
GetCrashReporterClient()->GetProductNameAndVersion(&product_name, &version);
|
|
|
|
|
|
|
|
writer.AddBoundary();
|
|
|
|
- writer.AddPairString("prod", product_name);
|
|
|
|
+ writer.AddPairString("product", product_name);
|
|
|
|
writer.AddBoundary();
|
|
|
|
- writer.AddPairString("ver", version);
|
|
|
|
+ writer.AddPairString("version", version);
|
|
|
|
writer.AddBoundary();
|
|
|
|
+
|
|
|
|
+#if defined(ARCH_CPU_32_BITS)
|
|
|
|
+ const char* platform = "linux32";
|
|
|
|
+#elif defined(ARCH_CPU_64_BITS)
|
|
|
|
+ const char* platform = "linux64";
|
|
|
|
+#endif
|
|
|
|
+ writer.AddPairString("platform", platform);
|
|
|
|
+ writer.AddBoundary();
|
|
|
|
+
|
|
|
|
if (info.pid > 0) {
|
|
|
|
char pid_value_buf[kUint64StringSize];
|
|
|
|
uint64_t pid_value_len = my_uint64_len(info.pid);
|
2017-04-20 21:28:17 +02:00
|
|
|
@@ -2004,6 +2015,17 @@ void InitCrashReporter(const std::string& process_type) {
|
2016-12-12 11:05:29 +01:00
|
|
|
PostEnableBreakpadInitialization();
|
|
|
|
}
|
|
|
|
|
|
|
|
+void SetCrashServerURL(const std::string& url) {
|
|
|
|
+ if (url.empty()) {
|
|
|
|
+ g_crash_server_url = nullptr;
|
|
|
|
+ } else {
|
|
|
|
+ char* new_url = new char[url.size() + 1];
|
|
|
|
+ ANNOTATE_LEAKING_OBJECT_PTR(new_url);
|
|
|
|
+ strcpy(new_url, url.c_str());
|
|
|
|
+ g_crash_server_url = new_url;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
#if defined(OS_ANDROID)
|
|
|
|
void InitNonBrowserCrashReporterForAndroid(const std::string& process_type) {
|
2017-03-03 23:37:23 +01:00
|
|
|
SanitizationInfo sanitization_info;
|
2016-12-12 11:05:29 +01:00
|
|
|
diff --git components/crash/content/app/breakpad_linux.h components/crash/content/app/breakpad_linux.h
|
2017-04-20 21:28:17 +02:00
|
|
|
index 0160f62..b732498 100644
|
2016-12-12 11:05:29 +01:00
|
|
|
--- components/crash/content/app/breakpad_linux.h
|
|
|
|
+++ components/crash/content/app/breakpad_linux.h
|
|
|
|
@@ -16,6 +16,9 @@ namespace breakpad {
|
|
|
|
// Turns on the crash reporter in any process.
|
|
|
|
extern void InitCrashReporter(const std::string& process_type);
|
|
|
|
|
|
|
|
+// Set the crash server URL.
|
|
|
|
+void SetCrashServerURL(const std::string& url);
|
|
|
|
+
|
|
|
|
#if defined(OS_ANDROID)
|
2017-04-20 21:28:17 +02:00
|
|
|
extern void InitCrashKeysForTesting();
|
|
|
|
|
2016-12-12 11:05:29 +01:00
|
|
|
diff --git components/crash/content/app/crash_reporter_client.cc components/crash/content/app/crash_reporter_client.cc
|
2017-04-20 21:28:17 +02:00
|
|
|
index 2e9ee28..de53f59 100644
|
2016-12-12 11:05:29 +01:00
|
|
|
--- components/crash/content/app/crash_reporter_client.cc
|
|
|
|
+++ components/crash/content/app/crash_reporter_client.cc
|
2017-01-12 17:44:35 +01:00
|
|
|
@@ -88,11 +88,12 @@ int CrashReporterClient::GetResultCodeRespawnFailed() {
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
-#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_IOS)
|
|
|
|
+#if defined(OS_POSIX) && !defined(OS_IOS)
|
|
|
|
void CrashReporterClient::GetProductNameAndVersion(const char** product_name,
|
|
|
|
const char** version) {
|
|
|
|
}
|
|
|
|
|
|
|
|
+#if !defined(OS_MACOSX)
|
|
|
|
base::FilePath CrashReporterClient::GetReporterLogFilename() {
|
|
|
|
return base::FilePath();
|
|
|
|
}
|
|
|
|
@@ -101,6 +102,7 @@ bool CrashReporterClient::HandleCrashDump(const char* crashdump_filename) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
#if defined(OS_WIN)
|
|
|
|
bool CrashReporterClient::GetCrashDumpLocation(base::string16* crash_dir) {
|
2017-04-20 21:28:17 +02:00
|
|
|
@@ -149,6 +151,32 @@ bool CrashReporterClient::ReportingIsEnforcedByPolicy(bool* breakpad_enabled) {
|
2016-12-12 11:05:29 +01:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
+bool CrashReporterClient::EnableBreakpadForProcess(
|
|
|
|
+ const std::string& process_type) {
|
|
|
|
+ return false;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+std::string CrashReporterClient::GetCrashServerURL() {
|
|
|
|
+ return std::string();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void CrashReporterClient::GetCrashOptionalArguments(
|
|
|
|
+ std::vector<std::string>* arguments) {
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#if defined(OS_WIN)
|
|
|
|
+base::string16 CrashReporterClient::GetCrashExternalHandler(
|
|
|
|
+ const base::string16& exe_dir) {
|
|
|
|
+ return exe_dir + L"\\crashpad_handler.exe";
|
|
|
|
+}
|
|
|
|
+#endif
|
2017-02-06 20:23:59 +01:00
|
|
|
+
|
|
|
|
+#if defined(OS_MACOSX)
|
|
|
|
+bool CrashReporterClient::EnableBrowserCrashForwarding() {
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+#endif
|
2016-12-12 11:05:29 +01:00
|
|
|
+
|
|
|
|
#if defined(OS_ANDROID)
|
|
|
|
int CrashReporterClient::GetAndroidMinidumpDescriptor() {
|
|
|
|
return 0;
|
2017-04-20 21:28:17 +02:00
|
|
|
@@ -179,9 +207,4 @@ bool CrashReporterClient::ShouldMonitorCrashHandlerExpensively() {
|
2016-12-12 11:05:29 +01:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
-bool CrashReporterClient::EnableBreakpadForProcess(
|
|
|
|
- const std::string& process_type) {
|
|
|
|
- return false;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
} // namespace crash_reporter
|
|
|
|
diff --git components/crash/content/app/crash_reporter_client.h components/crash/content/app/crash_reporter_client.h
|
2017-04-20 21:28:17 +02:00
|
|
|
index 9f69c19..2abaee00 100644
|
2016-12-12 11:05:29 +01:00
|
|
|
--- components/crash/content/app/crash_reporter_client.h
|
|
|
|
+++ components/crash/content/app/crash_reporter_client.h
|
|
|
|
@@ -8,6 +8,7 @@
|
|
|
|
#include <stddef.h>
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
+#include <vector>
|
|
|
|
|
|
|
|
#include "base/strings/string16.h"
|
|
|
|
#include "build/build_config.h"
|
2017-01-12 17:44:35 +01:00
|
|
|
@@ -104,12 +105,13 @@ class CrashReporterClient {
|
|
|
|
virtual int GetResultCodeRespawnFailed();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
-#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_IOS)
|
|
|
|
+#if defined(OS_POSIX) && !defined(OS_IOS)
|
|
|
|
// Returns a textual description of the product type and version to include
|
|
|
|
// in the crash report. Neither out parameter should be set to NULL.
|
|
|
|
virtual void GetProductNameAndVersion(const char** product_name,
|
|
|
|
const char** version);
|
|
|
|
|
|
|
|
+#if !defined(OS_MACOSX)
|
|
|
|
virtual base::FilePath GetReporterLogFilename();
|
|
|
|
|
|
|
|
// Custom crash minidump handler after the minidump is generated.
|
|
|
|
@@ -119,6 +121,7 @@ class CrashReporterClient {
|
|
|
|
// libc nor allocate memory normally.
|
|
|
|
virtual bool HandleCrashDump(const char* crashdump_filename);
|
|
|
|
#endif
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
// The location where minidump files should be written. Returns true if
|
|
|
|
// |crash_dir| was set. Windows has to use base::string16 because this code
|
2017-04-20 21:28:17 +02:00
|
|
|
@@ -197,6 +200,23 @@ class CrashReporterClient {
|
2016-12-12 11:05:29 +01:00
|
|
|
|
|
|
|
// Returns true if breakpad should run in the given process type.
|
|
|
|
virtual bool EnableBreakpadForProcess(const std::string& process_type);
|
|
|
|
+
|
|
|
|
+ // Returns the URL for submitting crash reports.
|
|
|
|
+ virtual std::string GetCrashServerURL();
|
|
|
|
+
|
|
|
|
+ // Populate |arguments| with additional optional arguments.
|
|
|
|
+ virtual void GetCrashOptionalArguments(std::vector<std::string>* arguments);
|
|
|
|
+
|
|
|
|
+#if defined(OS_WIN)
|
|
|
|
+ // Returns the absolute path to the external crash handler exe.
|
|
|
|
+ virtual base::string16 GetCrashExternalHandler(const base::string16& exe_dir);
|
2017-02-06 20:23:59 +01:00
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#if defined(OS_MACOSX)
|
|
|
|
+ // Returns true if forwarding of crashes to the system crash reporter is
|
|
|
|
+ // enabled for the browser process.
|
|
|
|
+ virtual bool EnableBrowserCrashForwarding();
|
2016-12-12 11:05:29 +01:00
|
|
|
+#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace crash_reporter
|
2017-02-06 20:23:59 +01:00
|
|
|
diff --git components/crash/content/app/crashpad.cc components/crash/content/app/crashpad.cc
|
2017-05-31 17:33:30 +02:00
|
|
|
index ba04da1..aa3f21a 100644
|
2017-02-06 20:23:59 +01:00
|
|
|
--- components/crash/content/app/crashpad.cc
|
|
|
|
+++ components/crash/content/app/crashpad.cc
|
2017-05-31 17:33:30 +02:00
|
|
|
@@ -143,7 +143,8 @@ void InitializeCrashpadImpl(bool initial_client,
|
2017-02-06 20:23:59 +01:00
|
|
|
// fallback. Forwarding is turned off for debug-mode builds even for the
|
|
|
|
// browser process, because the system's crash reporter can take a very long
|
|
|
|
// time to chew on symbols.
|
|
|
|
- if (!browser_process || is_debug_build) {
|
|
|
|
+ if (!browser_process || is_debug_build ||
|
|
|
|
+ !crash_reporter_client->EnableBrowserCrashForwarding()) {
|
|
|
|
crashpad_info->set_system_crash_reporter_forwarding(
|
|
|
|
crashpad::TriState::kDisabled);
|
|
|
|
}
|
2016-12-12 11:05:29 +01:00
|
|
|
diff --git components/crash/content/app/crashpad_mac.mm components/crash/content/app/crashpad_mac.mm
|
2017-05-31 17:33:30 +02:00
|
|
|
index 485c2b4..3b5f3ea 100644
|
2016-12-12 11:05:29 +01:00
|
|
|
--- components/crash/content/app/crashpad_mac.mm
|
|
|
|
+++ components/crash/content/app/crashpad_mac.mm
|
|
|
|
@@ -16,11 +16,14 @@
|
|
|
|
#include "base/logging.h"
|
|
|
|
#include "base/mac/bundle_locations.h"
|
|
|
|
#include "base/mac/foundation_util.h"
|
|
|
|
+#include "base/path_service.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 "components/crash/content/app/crash_reporter_client.h"
|
|
|
|
+#include "components/crash/content/app/crash_switches.h"
|
|
|
|
+#include "content/public/common/content_paths.h"
|
|
|
|
#include "third_party/crashpad/crashpad/client/crash_report_database.h"
|
|
|
|
#include "third_party/crashpad/crashpad/client/crashpad_client.h"
|
|
|
|
#include "third_party/crashpad/crashpad/client/crashpad_info.h"
|
2017-05-31 17:33:30 +02:00
|
|
|
@@ -42,9 +45,10 @@ base::FilePath PlatformCrashpadInitialization(
|
2016-12-12 11:05:29 +01:00
|
|
|
|
|
|
|
if (initial_client) {
|
|
|
|
@autoreleasepool {
|
|
|
|
- base::FilePath framework_bundle_path = base::mac::FrameworkBundlePath();
|
|
|
|
- base::FilePath handler_path =
|
|
|
|
- framework_bundle_path.Append("Helpers").Append("crashpad_handler");
|
|
|
|
+ // Use the same subprocess helper exe.
|
|
|
|
+ base::FilePath handler_path;
|
|
|
|
+ PathService::Get(content::CHILD_PROCESS_EXE, &handler_path);
|
|
|
|
+ DCHECK(!handler_path.empty());
|
|
|
|
|
|
|
|
// Is there a way to recover if this fails?
|
|
|
|
CrashReporterClient* crash_reporter_client = GetCrashReporterClient();
|
2017-05-31 17:33:30 +02:00
|
|
|
@@ -56,16 +60,27 @@ base::FilePath PlatformCrashpadInitialization(
|
2016-12-12 11:05:29 +01:00
|
|
|
// crash server won't have symbols for any other build types.
|
|
|
|
std::string url = "https://clients2.google.com/cr/report";
|
|
|
|
#else
|
|
|
|
- std::string url;
|
|
|
|
+ std::string url = crash_reporter_client->GetCrashServerURL();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
std::map<std::string, std::string> process_annotations;
|
2017-01-12 17:44:35 +01:00
|
|
|
|
|
|
|
+ const char* product_name = "";
|
|
|
|
+ const char* product_version = "";
|
|
|
|
+ crash_reporter_client->GetProductNameAndVersion(&product_name,
|
|
|
|
+ &product_version);
|
2017-04-27 03:59:52 +02:00
|
|
|
+
|
2017-01-12 17:44:35 +01:00
|
|
|
NSBundle* outer_bundle = base::mac::OuterBundle();
|
|
|
|
- NSString* product = base::mac::ObjCCast<NSString>([outer_bundle
|
|
|
|
- objectForInfoDictionaryKey:base::mac::CFToNSCast(kCFBundleNameKey)]);
|
|
|
|
- process_annotations["prod"] =
|
|
|
|
- base::SysNSStringToUTF8(product).append("_Mac");
|
|
|
|
+
|
|
|
|
+ if (strlen(product_name) == 0) {
|
|
|
|
+ NSString* product = base::mac::ObjCCast<NSString>([outer_bundle
|
|
|
|
+ objectForInfoDictionaryKey:base::mac::CFToNSCast(
|
|
|
|
+ kCFBundleNameKey)]);
|
2017-01-25 19:37:12 +01:00
|
|
|
+ process_annotations["product"] =
|
2017-01-12 17:44:35 +01:00
|
|
|
+ base::SysNSStringToUTF8(product).append("_Mac");
|
|
|
|
+ } else {
|
2017-01-25 19:37:12 +01:00
|
|
|
+ process_annotations["product"] = product_name;
|
2017-01-12 17:44:35 +01:00
|
|
|
+ }
|
|
|
|
|
|
|
|
#if defined(GOOGLE_CHROME_BUILD)
|
2017-04-20 21:28:17 +02:00
|
|
|
// Empty means stable.
|
2017-05-31 17:33:30 +02:00
|
|
|
@@ -81,12 +96,16 @@ base::FilePath PlatformCrashpadInitialization(
|
2017-04-20 21:28:17 +02:00
|
|
|
process_annotations["channel"] = "";
|
2017-01-12 17:44:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
- NSString* version =
|
|
|
|
- base::mac::ObjCCast<NSString>([base::mac::FrameworkBundle()
|
|
|
|
- objectForInfoDictionaryKey:@"CFBundleShortVersionString"]);
|
|
|
|
- process_annotations["ver"] = base::SysNSStringToUTF8(version);
|
|
|
|
+ if (strlen(product_version) == 0) {
|
|
|
|
+ NSString* version =
|
|
|
|
+ base::mac::ObjCCast<NSString>([base::mac::FrameworkBundle()
|
|
|
|
+ objectForInfoDictionaryKey:@"CFBundleShortVersionString"]);
|
2017-01-25 19:37:12 +01:00
|
|
|
+ process_annotations["version"] = base::SysNSStringToUTF8(version);
|
2017-01-12 17:44:35 +01:00
|
|
|
+ } else {
|
2017-01-25 19:37:12 +01:00
|
|
|
+ process_annotations["version"] = product_version;
|
2017-01-12 17:44:35 +01:00
|
|
|
+ }
|
|
|
|
|
2017-01-25 19:37:12 +01:00
|
|
|
- process_annotations["plat"] = std::string("OS X");
|
|
|
|
+ process_annotations["platform"] = std::string("macos");
|
2017-01-12 17:44:35 +01:00
|
|
|
|
2017-01-25 19:37:12 +01:00
|
|
|
std::vector<std::string> arguments;
|
2017-04-20 21:28:17 +02:00
|
|
|
|
2017-05-31 17:33:30 +02:00
|
|
|
@@ -108,6 +127,12 @@ base::FilePath PlatformCrashpadInitialization(
|
2016-12-12 11:05:29 +01:00
|
|
|
"--reset-own-crash-exception-port-to-system-default");
|
|
|
|
}
|
2017-05-31 17:33:30 +02:00
|
|
|
|
2016-12-12 11:05:29 +01:00
|
|
|
+ // Since we're using the same subprocess helper exe we must specify the
|
|
|
|
+ // process type.
|
|
|
|
+ arguments.push_back(std::string("--type=") + switches::kCrashpadHandler);
|
|
|
|
+
|
|
|
|
+ crash_reporter_client->GetCrashOptionalArguments(&arguments);
|
2017-05-31 17:33:30 +02:00
|
|
|
+
|
2017-04-20 21:28:17 +02:00
|
|
|
bool result = GetCrashpadClient().StartHandler(
|
|
|
|
handler_path, database_path, metrics_path, url, process_annotations,
|
2017-05-31 17:33:30 +02:00
|
|
|
arguments, true, false);
|
2016-12-12 11:05:29 +01:00
|
|
|
diff --git components/crash/content/app/crashpad_win.cc components/crash/content/app/crashpad_win.cc
|
2017-05-31 17:33:30 +02:00
|
|
|
index 6fdfd83..1d5a2a9 100644
|
2016-12-12 11:05:29 +01:00
|
|
|
--- components/crash/content/app/crashpad_win.cc
|
|
|
|
+++ components/crash/content/app/crashpad_win.cc
|
2017-04-20 21:28:17 +02:00
|
|
|
@@ -33,8 +33,8 @@ void GetPlatformCrashpadAnnotations(
|
2017-01-25 19:37:12 +01:00
|
|
|
base::string16 product_name, version, special_build, channel_name;
|
|
|
|
crash_reporter_client->GetProductNameAndVersion(
|
|
|
|
exe_file, &product_name, &version, &special_build, &channel_name);
|
|
|
|
- (*annotations)["prod"] = base::UTF16ToUTF8(product_name);
|
|
|
|
- (*annotations)["ver"] = base::UTF16ToUTF8(version);
|
|
|
|
+ (*annotations)["product"] = base::UTF16ToUTF8(product_name);
|
|
|
|
+ (*annotations)["version"] = base::UTF16ToUTF8(version);
|
2017-04-20 21:28:17 +02:00
|
|
|
#if defined(GOOGLE_CHROME_BUILD)
|
|
|
|
// Empty means stable.
|
|
|
|
const bool allow_empty_channel = true;
|
|
|
|
@@ -46,9 +46,9 @@ void GetPlatformCrashpadAnnotations(
|
2017-01-25 19:37:12 +01:00
|
|
|
if (!special_build.empty())
|
|
|
|
(*annotations)["special"] = base::UTF16ToUTF8(special_build);
|
|
|
|
#if defined(ARCH_CPU_X86)
|
|
|
|
- (*annotations)["plat"] = std::string("Win32");
|
2017-04-27 19:02:21 +02:00
|
|
|
+ (*annotations)["platform"] = std::string("win32");
|
2017-01-25 19:37:12 +01:00
|
|
|
#elif defined(ARCH_CPU_X86_64)
|
|
|
|
- (*annotations)["plat"] = std::string("Win64");
|
2017-04-27 19:02:21 +02:00
|
|
|
+ (*annotations)["platform"] = std::string("win64");
|
2017-01-25 19:37:12 +01:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2017-05-31 17:33:30 +02:00
|
|
|
@@ -82,7 +82,7 @@ base::FilePath PlatformCrashpadInitialization(
|
2016-12-12 11:05:29 +01:00
|
|
|
#if defined(GOOGLE_CHROME_BUILD)
|
|
|
|
std::string url = "https://clients2.google.com/cr/report";
|
|
|
|
#else
|
|
|
|
- std::string url;
|
|
|
|
+ std::string url = crash_reporter_client->GetCrashServerURL();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Allow the crash server to be overridden for testing. If the variable
|
2017-05-31 17:33:30 +02:00
|
|
|
@@ -102,13 +102,14 @@ base::FilePath PlatformCrashpadInitialization(
|
2017-01-13 21:23:19 +01:00
|
|
|
crashpad::TriState::kEnabled, kIndirectMemoryLimit);
|
|
|
|
}
|
|
|
|
|
|
|
|
- // If the handler is embedded in the binary (e.g. chrome, setup), we
|
|
|
|
- // reinvoke it with --type=crashpad-handler. Otherwise, we use the
|
|
|
|
- // standalone crashpad_handler.exe (for tests, etc.).
|
2017-04-20 21:28:17 +02:00
|
|
|
std::vector<std::string> start_arguments;
|
2017-04-27 03:59:52 +02:00
|
|
|
+
|
2017-01-13 21:23:19 +01:00
|
|
|
+ // Always add --type=crashpad-handler because the value is expected by
|
|
|
|
+ // CefExecuteProcess.
|
2017-04-20 21:28:17 +02:00
|
|
|
+ start_arguments.push_back(
|
|
|
|
+ std::string("--type=") + switches::kCrashpadHandler);
|
2017-01-13 21:23:19 +01:00
|
|
|
+
|
|
|
|
if (embedded_handler) {
|
2017-04-20 21:28:17 +02:00
|
|
|
- start_arguments.push_back(std::string("--type=") +
|
|
|
|
- switches::kCrashpadHandler);
|
2017-05-31 17:33:30 +02:00
|
|
|
if (!user_data_dir.empty()) {
|
|
|
|
start_arguments.push_back(std::string("--user-data-dir=") +
|
|
|
|
user_data_dir);
|
|
|
|
@@ -119,9 +120,12 @@ base::FilePath PlatformCrashpadInitialization(
|
2017-04-20 21:28:17 +02:00
|
|
|
start_arguments.push_back("/prefetch:7");
|
2016-12-12 11:05:29 +01:00
|
|
|
} else {
|
|
|
|
base::FilePath exe_dir = exe_file.DirName();
|
|
|
|
- exe_file = exe_dir.Append(FILE_PATH_LITERAL("crashpad_handler.exe"));
|
|
|
|
+ exe_file = base::FilePath(
|
|
|
|
+ crash_reporter_client->GetCrashExternalHandler(exe_dir.value()));
|
|
|
|
}
|
|
|
|
|
2017-04-20 21:28:17 +02:00
|
|
|
+ crash_reporter_client->GetCrashOptionalArguments(&start_arguments);
|
2016-12-12 11:05:29 +01:00
|
|
|
+
|
2017-04-20 21:28:17 +02:00
|
|
|
std::vector<std::string> arguments(start_arguments);
|
|
|
|
|
|
|
|
if (crash_reporter_client->ShouldMonitorCrashHandlerExpensively()) {
|
2016-12-12 11:05:29 +01:00
|
|
|
diff --git content/browser/frame_host/debug_urls.cc content/browser/frame_host/debug_urls.cc
|
2017-04-20 21:28:17 +02:00
|
|
|
index bcf53d5..d4f070b 100644
|
2016-12-12 11:05:29 +01:00
|
|
|
--- content/browser/frame_host/debug_urls.cc
|
|
|
|
+++ content/browser/frame_host/debug_urls.cc
|
2017-03-03 23:37:23 +01:00
|
|
|
@@ -139,7 +139,9 @@ bool HandleDebugURL(const GURL& url, ui::PageTransition transition) {
|
2016-12-12 11:05:29 +01:00
|
|
|
cc::switches::kEnableGpuBenchmarking) &&
|
|
|
|
(PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_TYPED));
|
|
|
|
|
|
|
|
- if (!(transition & ui::PAGE_TRANSITION_FROM_ADDRESS_BAR) &&
|
|
|
|
+ // CEF does not use PAGE_TRANSITION_FROM_ADDRESS_BAR.
|
|
|
|
+ if (!(transition & (ui::PAGE_TRANSITION_TYPED ||
|
|
|
|
+ ui::PAGE_TRANSITION_FROM_ADDRESS_BAR)) &&
|
|
|
|
!is_telemetry_navigation)
|
|
|
|
return false;
|
|
|
|
|