diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-07-12 14:07:37 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-07-17 10:29:26 +0000 |
commit | ec02ee4181c49b61fce1c8fb99292dbb8139cc90 (patch) | |
tree | 25cde714b2b71eb639d1cd53f5a22e9ba76e14ef /chromium/components/crash | |
parent | bb09965444b5bb20b096a291445170876225268d (diff) | |
download | qtwebengine-chromium-ec02ee4181c49b61fce1c8fb99292dbb8139cc90.tar.gz |
BASELINE: Update Chromium to 59.0.3071.134
Change-Id: Id02ef6fb2204c5fd21668a1c3e6911c83b17585a
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/components/crash')
16 files changed, 162 insertions, 62 deletions
diff --git a/chromium/components/crash/content/app/breakpad_linux.cc b/chromium/components/crash/content/app/breakpad_linux.cc index 722ce16dca6..0d3de65043a 100644 --- a/chromium/components/crash/content/app/breakpad_linux.cc +++ b/chromium/components/crash/content/app/breakpad_linux.cc @@ -143,7 +143,7 @@ class MicrodumpInfo { void SetMinidumpSanitizationFields(MinidumpDescriptor* minidump_descriptor, const SanitizationInfo& sanitization_info); -base::LazyInstance<MicrodumpInfo> g_microdump_info = +base::LazyInstance<MicrodumpInfo>::DestructorAtExit g_microdump_info = LAZY_INSTANCE_INITIALIZER; #endif @@ -980,9 +980,7 @@ void MicrodumpInfo::Initialize(const std::string& process_type, true, // Install handlers. -1); // Server file descriptor. -1 for in-process. - if (process_type != kWebViewSingleProcessType && - process_type != kBrowserProcessType && - !process_type.empty()) { + if (!is_browser_process) { g_signal_code_pipe_fd = GetCrashReporterClient()->GetAndroidCrashSignalFD(); if (g_signal_code_pipe_fd != -1) @@ -1953,7 +1951,14 @@ void InitCrashReporter(const std::string& process_type) { if (parsed_command_line.HasSwitch(switches::kDisableBreakpad)) return; - if (process_type.empty()) { + bool is_browser_process = +#if defined(OS_ANDROID) + process_type == kWebViewSingleProcessType || + process_type == kBrowserProcessType || +#endif + process_type.empty(); + + if (is_browser_process) { bool enable_breakpad = GetCrashReporterClient()->GetCollectStatsConsent() || GetCrashReporterClient()->IsRunningUnattended(); enable_breakpad &= diff --git a/chromium/components/crash/content/app/breakpad_win.cc b/chromium/components/crash/content/app/breakpad_win.cc index c80c02303db..c09961c7f6a 100644 --- a/chromium/components/crash/content/app/breakpad_win.cc +++ b/chromium/components/crash/content/app/breakpad_win.cc @@ -290,10 +290,10 @@ long WINAPI ChromeExceptionFilter(EXCEPTION_POINTERS* info) { return EXCEPTION_EXECUTE_HANDLER; } -// Exception filter for the service process used when breakpad is not enabled. -// We just display the "Do you want to restart" message and then die -// (without calling the previous filter). -long WINAPI ServiceExceptionFilter(EXCEPTION_POINTERS* info) { +// Exception filter for the Cloud Print service process used when breakpad is +// not enabled. We just display the "Do you want to restart" message and then +// die (without calling the previous filter). +long WINAPI CloudPrintServiceExceptionFilter(EXCEPTION_POINTERS* info) { DumpDoneCallback(NULL, NULL, NULL, info, NULL, false); return EXCEPTION_EXECUTE_HANDLER; } @@ -583,7 +583,7 @@ void InitCrashReporter(const std::string& process_type_switch) { default_filter = &ChromeExceptionFilter; } else if (process_type == L"service") { callback = &DumpDoneCallback; - default_filter = &ServiceExceptionFilter; + default_filter = &CloudPrintServiceExceptionFilter; } if (GetCrashReporterClient()->ShouldCreatePipeName(process_type)) diff --git a/chromium/components/crash/content/app/crash_reporter_client.cc b/chromium/components/crash/content/app/crash_reporter_client.cc index eac090b9cad..2e9ee28e1b0 100644 --- a/chromium/components/crash/content/app/crash_reporter_client.cc +++ b/chromium/components/crash/content/app/crash_reporter_client.cc @@ -173,6 +173,12 @@ bool CrashReporterClient::ShouldEnableBreakpadMicrodumps() { } #endif +#if defined(OS_MACOSX) || defined(OS_WIN) +bool CrashReporterClient::ShouldMonitorCrashHandlerExpensively() { + return false; +} +#endif + bool CrashReporterClient::EnableBreakpadForProcess( const std::string& process_type) { return false; diff --git a/chromium/components/crash/content/app/crash_reporter_client.h b/chromium/components/crash/content/app/crash_reporter_client.h index ccc30483da6..9f69c193dda 100644 --- a/chromium/components/crash/content/app/crash_reporter_client.h +++ b/chromium/components/crash/content/app/crash_reporter_client.h @@ -179,6 +179,22 @@ class CrashReporterClient { virtual bool ShouldEnableBreakpadMicrodumps(); #endif +#if defined(OS_MACOSX) || defined(OS_WIN) + // This method should return true to configure a crash reporter capable of + // monitoring itself for its own crashes to do so, even if self-monitoring + // would be expensive. "Expensive" self-monitoring dedicates an additional + // crash handler process to handle the crashes of the initial crash handler + // process. + // + // In some cases, inexpensive self-monitoring may also be available. When it + // is, it may be used when this method returns false. If only expensive + // self-monitoring is available, returning false from this function will + // prevent the crash handler process from being monitored for crashes at all. + // + // The default implementation returns false. + virtual bool ShouldMonitorCrashHandlerExpensively(); +#endif + // Returns true if breakpad should run in the given process type. virtual bool EnableBreakpadForProcess(const std::string& process_type); }; diff --git a/chromium/components/crash/content/app/crashpad.cc b/chromium/components/crash/content/app/crashpad.cc index 76f67348ab0..dcec3468435 100644 --- a/chromium/components/crash/content/app/crashpad.cc +++ b/chromium/components/crash/content/app/crashpad.cc @@ -204,6 +204,12 @@ void InitializeCrashpadWithEmbeddedHandler(bool initial_client, } #endif // OS_WIN +crashpad::CrashpadClient& GetCrashpadClient() { + static crashpad::CrashpadClient* const client = + new crashpad::CrashpadClient(); + return *client; +} + void SetUploadConsent(bool consent) { if (!g_database) return; diff --git a/chromium/components/crash/content/app/crashpad.h b/chromium/components/crash/content/app/crashpad.h index eeb65ac69b7..ada0eaec733 100644 --- a/chromium/components/crash/content/app/crashpad.h +++ b/chromium/components/crash/content/app/crashpad.h @@ -12,6 +12,15 @@ #include <vector> #include "base/files/file_path.h" +#include "build/build_config.h" + +#if defined(OS_MACOSX) +#include "base/mac/scoped_mach_port.h" +#endif + +namespace crashpad { +class CrashpadClient; +} namespace crash_reporter { @@ -55,6 +64,10 @@ void InitializeCrashpadWithEmbeddedHandler(bool initial_client, const std::string& process_type); #endif // OS_WIN +// Returns the CrashpadClient for this process. This will lazily create it if +// it does not already exist. This is called as part of InitializeCrashpad. +crashpad::CrashpadClient& GetCrashpadClient(); + // Enables or disables crash report upload, taking the given consent to upload // into account. Consent may be ignored, uploads may not be enabled even with // consent, but will only be enabled without consent when policy enforces crash diff --git a/chromium/components/crash/content/app/crashpad_mac.mm b/chromium/components/crash/content/app/crashpad_mac.mm index 7df66ea3d32..3bae07e14c6 100644 --- a/chromium/components/crash/content/app/crashpad_mac.mm +++ b/chromium/components/crash/content/app/crashpad_mac.mm @@ -66,12 +66,18 @@ base::FilePath PlatformCrashpadInitialization(bool initial_client, base::SysNSStringToUTF8(product).append("_Mac"); #if defined(GOOGLE_CHROME_BUILD) + // Empty means stable. + const bool allow_empty_channel = true; +#else + const bool allow_empty_channel = false; +#endif NSString* channel = base::mac::ObjCCast<NSString>( [outer_bundle objectForInfoDictionaryKey:@"KSChannelID"]); if (channel) { process_annotations["channel"] = base::SysNSStringToUTF8(channel); + } else if (allow_empty_channel) { + process_annotations["channel"] = ""; } -#endif NSString* version = base::mac::ObjCCast<NSString>([base::mac::FrameworkBundle() @@ -81,6 +87,16 @@ base::FilePath PlatformCrashpadInitialization(bool initial_client, process_annotations["plat"] = std::string("OS X"); std::vector<std::string> arguments; + + if (crash_reporter_client->ShouldMonitorCrashHandlerExpensively()) { + arguments.push_back("--monitor-self"); + } + + // Set up --monitor-self-annotation even in the absence of --monitor-self + // so that minidumps produced by Crashpad's generate_dump tool will + // contain these annotations. + arguments.push_back("--monitor-self-annotation=ptype=crashpad-handler"); + 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 @@ -90,15 +106,9 @@ base::FilePath PlatformCrashpadInitialization(bool initial_client, "--reset-own-crash-exception-port-to-system-default"); } - crashpad::CrashpadClient crashpad_client; - bool result = crashpad_client.StartHandler(handler_path, - database_path, - metrics_path, - url, - process_annotations, - arguments, - true, - false); + bool result = GetCrashpadClient().StartHandler( + handler_path, database_path, metrics_path, url, process_annotations, + arguments, true, false); // If this is an initial client that's not the browser process, it's // important to sever the connection to any existing handler. If diff --git a/chromium/components/crash/content/app/crashpad_win.cc b/chromium/components/crash/content/app/crashpad_win.cc index 89f3d2b9926..94a350f4b5a 100644 --- a/chromium/components/crash/content/app/crashpad_win.cc +++ b/chromium/components/crash/content/app/crashpad_win.cc @@ -9,7 +9,6 @@ #include "base/debug/crash_logging.h" #include "base/environment.h" #include "base/files/file_util.h" -#include "base/lazy_instance.h" #include "base/numerics/safe_conversions.h" #include "base/strings/string16.h" #include "base/strings/string_number_conversions.h" @@ -26,13 +25,6 @@ namespace crash_reporter { namespace internal { -namespace { - -base::LazyInstance<crashpad::CrashpadClient>::Leaky g_crashpad_client = - LAZY_INSTANCE_INITIALIZER; - -} // namespace - void GetPlatformCrashpadAnnotations( std::map<std::string, std::string>* annotations) { CrashReporterClient* crash_reporter_client = GetCrashReporterClient(); @@ -43,7 +35,14 @@ void GetPlatformCrashpadAnnotations( exe_file, &product_name, &version, &special_build, &channel_name); (*annotations)["prod"] = base::UTF16ToUTF8(product_name); (*annotations)["ver"] = base::UTF16ToUTF8(version); - (*annotations)["channel"] = base::UTF16ToUTF8(channel_name); +#if defined(GOOGLE_CHROME_BUILD) + // Empty means stable. + const bool allow_empty_channel = true; +#else + const bool allow_empty_channel = false; +#endif + if (allow_empty_channel || !channel_name.empty()) + (*annotations)["channel"] = base::UTF16ToUTF8(channel_name); if (!special_build.empty()) (*annotations)["special"] = base::UTF16ToUTF8(special_build); #if defined(ARCH_CPU_X86) @@ -104,32 +103,48 @@ base::FilePath PlatformCrashpadInitialization(bool initial_client, // 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.). - std::vector<std::string> arguments; + std::vector<std::string> start_arguments; if (embedded_handler) { - arguments.push_back(std::string("--type=") + switches::kCrashpadHandler); + start_arguments.push_back(std::string("--type=") + + switches::kCrashpadHandler); // The prefetch argument added here has to be documented in // chrome_switches.cc, below the kPrefetchArgument* constants. A constant // can't be used here because crashpad can't depend on Chrome. - arguments.push_back("/prefetch:7"); + start_arguments.push_back("/prefetch:7"); } else { base::FilePath exe_dir = exe_file.DirName(); exe_file = exe_dir.Append(FILE_PATH_LITERAL("crashpad_handler.exe")); } - g_crashpad_client.Get().StartHandler( - exe_file, database_path, metrics_path, url, process_annotations, - arguments, false, false); + std::vector<std::string> arguments(start_arguments); + + if (crash_reporter_client->ShouldMonitorCrashHandlerExpensively()) { + arguments.push_back("--monitor-self"); + for (const std::string& start_argument : start_arguments) { + arguments.push_back(std::string("--monitor-self-argument=") + + start_argument); + } + } + + // Set up --monitor-self-annotation even in the absence of --monitor-self so + // that minidumps produced by Crashpad's generate_dump tool will contain + // these annotations. + arguments.push_back(std::string("--monitor-self-annotation=ptype=") + + switches::kCrashpadHandler); + + GetCrashpadClient().StartHandler(exe_file, database_path, metrics_path, url, + process_annotations, arguments, false, + false); // If we're the browser, push the pipe name into the environment so child // processes can connect to it. If we inherited another crashpad_handler's // pipe name, we'll overwrite it here. env->SetVar(kPipeNameVar, - base::UTF16ToUTF8(g_crashpad_client.Get().GetHandlerIPCPipe())); + base::UTF16ToUTF8(GetCrashpadClient().GetHandlerIPCPipe())); } else { std::string pipe_name_utf8; if (env->GetVar(kPipeNameVar, &pipe_name_utf8)) { - g_crashpad_client.Get().SetHandlerIPCPipe( - base::UTF8ToUTF16(pipe_name_utf8)); + GetCrashpadClient().SetHandlerIPCPipe(base::UTF8ToUTF16(pipe_name_utf8)); } } @@ -218,7 +233,7 @@ extern "C" { // releases of Chrome. Please contact syzygy-team@chromium.org before doing so! int __declspec(dllexport) CrashForException( EXCEPTION_POINTERS* info) { - crash_reporter::internal::g_crashpad_client.Get().DumpAndCrash(info); + crash_reporter::GetCrashpadClient().DumpAndCrash(info); return EXCEPTION_CONTINUE_SEARCH; } diff --git a/chromium/components/crash/content/app/fallback_crash_handler_launcher_win_unittest.cc b/chromium/components/crash/content/app/fallback_crash_handler_launcher_win_unittest.cc index c19ae79d17d..07340432cec 100644 --- a/chromium/components/crash/content/app/fallback_crash_handler_launcher_win_unittest.cc +++ b/chromium/components/crash/content/app/fallback_crash_handler_launcher_win_unittest.cc @@ -143,9 +143,10 @@ TEST_F(FallbackCrashHandlerLauncherTest, LaunchAndWaitForHandler) { // Because this process is heavily multithreaded it's going to be flaky // and generally fraught with peril to try and grab a minidump of it. // Instead, fire off a sacrificial process to do the testing. - base::Process test_process = SpawnChild("TestCrashHandlerLauncherMain"); + base::SpawnChildResult spawn_child = + SpawnChild("TestCrashHandlerLauncherMain"); int exit_code = 0; - ASSERT_TRUE(test_process.WaitForExit(&exit_code)); + ASSERT_TRUE(spawn_child.process.WaitForExit(&exit_code)); ASSERT_EQ(0, exit_code); } diff --git a/chromium/components/crash/content/app/fallback_crash_handler_win.cc b/chromium/components/crash/content/app/fallback_crash_handler_win.cc index 2e3310d874d..01f63f364dd 100644 --- a/chromium/components/crash/content/app/fallback_crash_handler_win.cc +++ b/chromium/components/crash/content/app/fallback_crash_handler_win.cc @@ -479,6 +479,7 @@ bool FallbackCrashHandler::GenerateCrashDump(const std::string& product, uint32_t minidump_type = MiniDumpWithUnloadedModules | MiniDumpWithProcessThreadData | + MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo; // Capture more detail for canary and dev channels. The prefix search caters diff --git a/chromium/components/crash/content/app/fallback_crash_handler_win_unittest.cc b/chromium/components/crash/content/app/fallback_crash_handler_win_unittest.cc index 13ca131f020..92c008ea804 100644 --- a/chromium/components/crash/content/app/fallback_crash_handler_win_unittest.cc +++ b/chromium/components/crash/content/app/fallback_crash_handler_win_unittest.cc @@ -169,12 +169,12 @@ TEST_F(FallbackCrashHandlerWinTest, GenerateCrashDump) { cmd_line.AppendSwitchPath("directory", database_dir_.GetPath()); base::LaunchOptions options; options.start_hidden = true; - base::Process test_child = base::SpawnMultiProcessTestChild( + base::SpawnChildResult spawn_child = base::SpawnMultiProcessTestChild( "FallbackCrashHandlerWinMain", cmd_line, options); - ASSERT_TRUE(test_child.IsValid()); + ASSERT_TRUE(spawn_child.process.IsValid()); int exit_code = -1; - ASSERT_TRUE(test_child.WaitForExit(&exit_code)); + ASSERT_TRUE(spawn_child.process.WaitForExit(&exit_code)); ASSERT_EQ(0, exit_code); // Validate that the database contains one valid crash dump. diff --git a/chromium/components/crash/content/app/fallback_crash_handling_win_unittest.cc b/chromium/components/crash/content/app/fallback_crash_handling_win_unittest.cc index 7df6b20262a..02d69c5dd27 100644 --- a/chromium/components/crash/content/app/fallback_crash_handling_win_unittest.cc +++ b/chromium/components/crash/content/app/fallback_crash_handling_win_unittest.cc @@ -62,12 +62,12 @@ TEST_F(FallbackCrashHandlingTest, SetupAndRunAsFallbackCrashHandler) { base::LaunchOptions options; options.start_hidden = true; - base::Process test_child = base::SpawnMultiProcessTestChild( + base::SpawnChildResult spawn_child = base::SpawnMultiProcessTestChild( "FallbackCrashHandlingWinRunHandler", cmd_line, options); - ASSERT_TRUE(test_child.IsValid()); + ASSERT_TRUE(spawn_child.process.IsValid()); int exit_code = -1; - ASSERT_TRUE(test_child.WaitForExit(&exit_code)); + ASSERT_TRUE(spawn_child.process.WaitForExit(&exit_code)); ASSERT_EQ(kFallbackCrashTerminationCode, static_cast<uint32_t>(exit_code)); // Validate that the database contains one valid crash dump. diff --git a/chromium/components/crash/content/app/run_as_crashpad_handler_win.cc b/chromium/components/crash/content/app/run_as_crashpad_handler_win.cc index 20be2d108cf..6ea93489f1f 100644 --- a/chromium/components/crash/content/app/run_as_crashpad_handler_win.cc +++ b/chromium/components/crash/content/app/run_as_crashpad_handler_win.cc @@ -14,25 +14,46 @@ #include "base/strings/string16.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "third_party/crashpad/crashpad/client/crashpad_info.h" +#include "third_party/crashpad/crashpad/client/simple_string_dictionary.h" #include "third_party/crashpad/crashpad/handler/handler_main.h" namespace crash_reporter { -int RunAsCrashpadHandler(const base::CommandLine& command_line) { +int RunAsCrashpadHandler(const base::CommandLine& command_line, + const char* process_type_switch) { // Make sure this process terminates on OOM in the same mode as other Chrome // processes. base::EnableTerminationOnOutOfMemory(); + // If the handler is started with --monitor-self, it'll need a ptype + // annotation set. It'll normally set one itself by being invoked with + // --monitor-self-annotation=ptype=crashpad-handler, but that leaves a window + // during self-monitoring initialization when the ptype is not set at all, so + // provide one here. + const std::string process_type = + command_line.GetSwitchValueASCII(process_type_switch); + if (!process_type.empty()) { + crashpad::SimpleStringDictionary* annotations = + new crashpad::SimpleStringDictionary(); + annotations->SetKeyValue("ptype", process_type.c_str()); + crashpad::CrashpadInfo* crashpad_info = + crashpad::CrashpadInfo::GetCrashpadInfo(); + DCHECK(!crashpad_info->simple_annotations()); + crashpad_info->set_simple_annotations(annotations); + } + std::vector<base::string16> argv = command_line.argv(); - const base::string16 process_type = L"--type="; - argv.erase(std::remove_if(argv.begin(), argv.end(), - [&process_type](const base::string16& str) { - return base::StartsWith( - str, process_type, - base::CompareCase::SENSITIVE) || - (!str.empty() && str[0] == L'/'); - }), - argv.end()); + const base::string16 process_type_arg_prefix = + base::string16(L"--") + base::UTF8ToUTF16(process_type_switch) + L"="; + argv.erase( + std::remove_if(argv.begin(), argv.end(), + [&process_type_arg_prefix](const base::string16& str) { + return base::StartsWith(str, process_type_arg_prefix, + base::CompareCase::SENSITIVE) || + (!str.empty() && str[0] == L'/'); + }), + argv.end()); std::unique_ptr<char* []> argv_as_utf8(new char*[argv.size() + 1]); std::vector<std::string> storage; @@ -44,7 +65,7 @@ int RunAsCrashpadHandler(const base::CommandLine& command_line) { argv_as_utf8[argv.size()] = nullptr; argv.clear(); return crashpad::HandlerMain(static_cast<int>(storage.size()), - argv_as_utf8.get()); + argv_as_utf8.get(), nullptr); } } // namespace crash_reporter diff --git a/chromium/components/crash/content/app/run_as_crashpad_handler_win.h b/chromium/components/crash/content/app/run_as_crashpad_handler_win.h index 8bed61093af..ade72a01db9 100644 --- a/chromium/components/crash/content/app/run_as_crashpad_handler_win.h +++ b/chromium/components/crash/content/app/run_as_crashpad_handler_win.h @@ -12,10 +12,15 @@ class CommandLine; namespace crash_reporter { // Helper for running an embedded copy of crashpad_handler. Searches for and -// removes --switches::kProcessType=xyz arguments in the command line, and all +// removes --(process_type_switch)=xyz arguments in the command line, and all // options starting with '/' (for "/prefetch:N"), and then runs // crashpad::HandlerMain with the remaining arguments. -int RunAsCrashpadHandler(const base::CommandLine& command_line); +// +// Normally, pass switches::kProcessType for process_type_switch. It's accepted +// as a parameter because this component does not have access to content/, where +// that variable lives. +int RunAsCrashpadHandler(const base::CommandLine& command_line, + const char* process_type_switch); } // namespace crash_reporter diff --git a/chromium/components/crash/content/browser/crash_dump_observer_android.cc b/chromium/components/crash/content/browser/crash_dump_observer_android.cc index bc5449f45df..72189b15d96 100644 --- a/chromium/components/crash/content/browser/crash_dump_observer_android.cc +++ b/chromium/components/crash/content/browser/crash_dump_observer_android.cc @@ -21,7 +21,8 @@ using content::BrowserThread; namespace breakpad { namespace { -base::LazyInstance<CrashDumpObserver> g_instance = LAZY_INSTANCE_INITIALIZER; +base::LazyInstance<CrashDumpObserver>::DestructorAtExit g_instance = + LAZY_INSTANCE_INITIALIZER; } // static diff --git a/chromium/components/crash/content/browser/crash_dump_observer_android.h b/chromium/components/crash/content/browser/crash_dump_observer_android.h index fbff47625db..3f049f31dd4 100644 --- a/chromium/components/crash/content/browser/crash_dump_observer_android.h +++ b/chromium/components/crash/content/browser/crash_dump_observer_android.h @@ -70,7 +70,7 @@ class CrashDumpObserver : public content::BrowserChildProcessObserver, content::FileDescriptorInfo* mappings); private: - friend struct base::DefaultLazyInstanceTraits<CrashDumpObserver>; + friend struct base::LazyInstanceTraitsBase<CrashDumpObserver>; CrashDumpObserver(); ~CrashDumpObserver() override; |