Chromium Code Reviews| Index: components/crash/content/app/fallback_crash_handling_win.cc |
| diff --git a/components/crash/content/app/fallback_crash_handling_win.cc b/components/crash/content/app/fallback_crash_handling_win.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..5a1d37b5d7843c61cbc50b5f522b4009971cb31f |
| --- /dev/null |
| +++ b/components/crash/content/app/fallback_crash_handling_win.cc |
| @@ -0,0 +1,79 @@ |
| +// Copyright 2017 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. |
| + |
| +#include "components/crash/content/app/fallback_crash_handling_win.h" |
| + |
| +#include <memory> |
| +#include <string> |
|
scottmg
2017/01/13 22:20:00
Can remove this, it's already in the header
Sigurður Ásgeirsson
2017/01/16 18:23:24
Done.
|
| + |
| +#include "base/command_line.h" |
| +#include "components/crash/content/app/crash_switches.h" |
| +#include "components/crash/content/app/fallback_crash_handler_launcher_win.h" |
| +#include "components/crash/content/app/fallback_crash_handler_win.h" |
| + |
| +namespace crash_reporter { |
| + |
| +namespace switches { |
| +const char kFallbackCrashHandler[] = "fallback-handler"; |
| +} |
| + |
| +namespace { |
| + |
| +std::unique_ptr<FallbackCrashHandlerLauncher> g_fallback_crash_handler_launcher; |
| + |
| +LONG WINAPI FallbackUnhandledExceptionFilter(EXCEPTION_POINTERS* exc_ptrs) { |
|
scottmg
2017/01/13 22:20:00
This doesn't seem to be used?
And apropros of tha
Sigurður Ásgeirsson
2017/01/13 22:40:28
I sure hope so. Monday, first thing. I wanna ship
|
| + if (!g_fallback_crash_handler_launcher) |
| + return EXCEPTION_CONTINUE_SEARCH; |
| + |
| + return g_fallback_crash_handler_launcher->LaunchAndWaitForHandler(exc_ptrs); |
| +} |
| + |
| +} // namespace |
| + |
| +void SetupFallbackCrashHandling(const base::CommandLine& command_line) { |
| + // Run the same program. |
| + base::CommandLine base_command_line(command_line.GetProgram()); |
| + base_command_line.AppendSwitchASCII("type", switches::kFallbackCrashHandler); |
| + |
| + // Get the database path. |
| + base::FilePath database_path = command_line.GetSwitchValuePath("database"); |
| + if (database_path.empty()) { |
| + NOTREACHED(); |
| + return; |
| + } |
| + |
| + std::unique_ptr<FallbackCrashHandlerLauncher> fallback_launcher( |
| + new FallbackCrashHandlerLauncher()); |
| + |
| + if (!fallback_launcher->Initialize(base_command_line, database_path)) { |
| + NOTREACHED(); |
| + return; |
| + } |
| + |
| + // Success, pass ownership to the global. |
| + g_fallback_crash_handler_launcher = std::move(fallback_launcher); |
| +} |
| + |
| +int RunAsFallbackCrashHandler(const base::CommandLine& command_line, |
| + std::string product_name, |
| + std::string version, |
| + std::string channel_name) { |
| + FallbackCrashHandler fallback_handler; |
| + |
| + if (!fallback_handler.ParseCommandLine(command_line)) { |
| + // TODO(siggi): Figure out how to UMA from this process, if need be. |
| + return 1; |
| + } |
| + |
| + if (!fallback_handler.GenerateCrashDump( |
| + product_name, version, channel_name, |
| + crash_reporter::switches::kCrashpadHandler)) { |
| + // TODO(siggi): Figure out how to UMA from this process, if need be. |
| + return 2; |
| + } |
| + |
| + return 0; |
| +} |
| + |
| +} // namespace crash_reporter |