| Index: components/crash/content/app/fallback_crash_handler_launcher_win.cc
|
| diff --git a/components/crash/content/app/fallback_crash_handler_launcher_win.cc b/components/crash/content/app/fallback_crash_handler_launcher_win.cc
|
| deleted file mode 100644
|
| index 2bf60ec6777c2e717257e293c8817c5a2961372a..0000000000000000000000000000000000000000
|
| --- a/components/crash/content/app/fallback_crash_handler_launcher_win.cc
|
| +++ /dev/null
|
| @@ -1,131 +0,0 @@
|
| -// 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_handler_launcher_win.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/win/win_util.h"
|
| -
|
| -namespace crash_reporter {
|
| -
|
| -namespace {
|
| -
|
| -// The number of characters reserved at the tail of the command line for the
|
| -// thread ID parameter.
|
| -const size_t kCommandLineTailSize = 32;
|
| -
|
| -} // namespace
|
| -
|
| -FallbackCrashHandlerLauncher::FallbackCrashHandlerLauncher() {
|
| - memset(&exception_pointers_, 0, sizeof(exception_pointers_));
|
| -}
|
| -
|
| -FallbackCrashHandlerLauncher::~FallbackCrashHandlerLauncher() {}
|
| -
|
| -bool FallbackCrashHandlerLauncher::Initialize(
|
| - const base::CommandLine& program,
|
| - const base::FilePath& crashpad_database) {
|
| - // Open an inheritable handle to self. This will be inherited to the handler.
|
| - const DWORD kAccessMask =
|
| - PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_DUP_HANDLE;
|
| - self_process_handle_.Set(
|
| - OpenProcess(kAccessMask, TRUE, ::GetCurrentProcessId()));
|
| - if (!self_process_handle_.IsValid())
|
| - return false;
|
| -
|
| - // Setup the startup info for inheriting the self process handle into the
|
| - // fallback crash handler.
|
| - if (!startup_info_.InitializeProcThreadAttributeList(1))
|
| - return false;
|
| -
|
| - HANDLE raw_self_process_handle = self_process_handle_.Get();
|
| - if (!startup_info_.UpdateProcThreadAttribute(
|
| - PROC_THREAD_ATTRIBUTE_HANDLE_LIST, &raw_self_process_handle,
|
| - sizeof(raw_self_process_handle))) {
|
| - return false;
|
| - }
|
| -
|
| - // Build the command line from a copy of the command line passed in.
|
| - base::CommandLine cmd_line(program);
|
| - cmd_line.AppendSwitchPath("database", crashpad_database);
|
| - cmd_line.AppendSwitchASCII(
|
| - "exception-pointers",
|
| - base::UintToString(reinterpret_cast<uintptr_t>(&exception_pointers_)));
|
| - cmd_line.AppendSwitchASCII(
|
| - "process", base::UintToString(
|
| - base::win::HandleToUint32(self_process_handle_.Get())));
|
| -
|
| - std::wstring str_cmd_line = cmd_line.GetCommandLineString();
|
| -
|
| - // Append the - for now abortive - thread argument manually.
|
| - str_cmd_line.append(L" --thread=");
|
| - // Store the command line string for easy use later.
|
| - cmd_line_.assign(str_cmd_line.begin(), str_cmd_line.end());
|
| -
|
| - // Resize the vector to reserve space for the thread ID.
|
| - cmd_line_.resize(cmd_line_.size() + kCommandLineTailSize, '\0');
|
| -
|
| - return true;
|
| -}
|
| -
|
| -DWORD FallbackCrashHandlerLauncher::LaunchAndWaitForHandler(
|
| - EXCEPTION_POINTERS* exception_pointers) {
|
| - DCHECK(!cmd_line_.empty());
|
| - DCHECK_EQ('=', cmd_line_[cmd_line_.size() - kCommandLineTailSize - 1]);
|
| - // This program has crashed. Try and not use anything but the stack.
|
| -
|
| - // Append the current thread's ID to the command line in-place.
|
| - int chars_appended = wsprintf(&cmd_line_.back() - kCommandLineTailSize + 1,
|
| - L"%d", GetCurrentThreadId());
|
| - DCHECK_GT(static_cast<int>(kCommandLineTailSize), chars_appended);
|
| -
|
| - // Copy the exception pointers to our member variable, whose address is
|
| - // already baked into the command line.
|
| - exception_pointers_ = *exception_pointers;
|
| -
|
| - // Launch the pre-cooked command line.
|
| -
|
| - PROCESS_INFORMATION process_info = {};
|
| - if (!CreateProcess(nullptr, // Application name.
|
| - &cmd_line_[0], // Command line.
|
| - nullptr, // Process attributes.
|
| - nullptr, // Thread attributes.
|
| - true, // Inherit handles.
|
| - 0, // Creation flags.
|
| - nullptr, // Environment.
|
| - nullptr, // Current directory.
|
| - startup_info_.startup_info(), // Startup info.
|
| - &process_info)) {
|
| - return GetLastError();
|
| - }
|
| -
|
| - // Wait on the fallback crash handler process. The expectation is that this
|
| - // will never return, as the fallback crash handler will terminate this
|
| - // process. For testing, and full-on belt and suspenders, cover for this
|
| - // returning.
|
| - DWORD error = WaitForSingleObject(process_info.hProcess, INFINITE);
|
| - if (error != WAIT_OBJECT_0) {
|
| - // This should never happen, barring handle abuse.
|
| - // TODO(siggi): Record an UMA metric here.
|
| - NOTREACHED();
|
| - error = GetLastError();
|
| - } else {
|
| - // On successful wait, return the exit code of the fallback crash handler
|
| - // process.
|
| - if (!GetExitCodeProcess(process_info.hProcess, &error)) {
|
| - // This should never happen, barring handle abuse.
|
| - NOTREACHED();
|
| - error = GetLastError();
|
| - }
|
| - }
|
| -
|
| - // Close the handles returned from CreateProcess.
|
| - CloseHandle(process_info.hProcess);
|
| - CloseHandle(process_info.hThread);
|
| -
|
| - return error;
|
| -}
|
| -
|
| -} // namespace crash_reporter
|
|
|