mirror of
https://github.com/yuzu-emu/breakpad.git
synced 2025-04-17 04:01:47 +00:00
A=bsmedberg R=ted at http://breakpad.appspot.com/406002 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@985 4c0a9323-5329-0410-9bdc-e9ce6186880e
183 lines
6.8 KiB
C++
183 lines
6.8 KiB
C++
// Copyright (c) 2008, Google Inc.
|
|
// All rights reserved.
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are
|
|
// met:
|
|
//
|
|
// * Redistributions of source code must retain the above copyright
|
|
// notice, this list of conditions and the following disclaimer.
|
|
// * Redistributions in binary form must reproduce the above
|
|
// copyright notice, this list of conditions and the following disclaimer
|
|
// in the documentation and/or other materials provided with the
|
|
// distribution.
|
|
// * Neither the name of Google Inc. nor the names of its
|
|
// contributors may be used to endorse or promote products derived from
|
|
// this software without specific prior written permission.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
|
|
#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
|
|
|
|
#include <windows.h>
|
|
#include <dbghelp.h>
|
|
#include <string>
|
|
#include <utility>
|
|
#include "client/windows/common/ipc_protocol.h"
|
|
#include "processor/scoped_ptr.h"
|
|
|
|
namespace google_breakpad {
|
|
|
|
struct CustomClientInfo;
|
|
|
|
// Abstraction of client-side implementation of out of process
|
|
// crash generation.
|
|
//
|
|
// The process that desires to have out-of-process crash dump
|
|
// generation service can use this class in the following way:
|
|
//
|
|
// * Create an instance.
|
|
// * Call Register method so that the client tries to register
|
|
// with the server process and check the return value. If
|
|
// registration is not successful, out-of-process crash dump
|
|
// generation will not be available
|
|
// * Request dump generation by calling either of the two
|
|
// overloaded RequestDump methods - one in case of exceptions
|
|
// and the other in case of assertion failures
|
|
//
|
|
// Note that it is the responsibility of the client code of
|
|
// this class to set the unhandled exception filter with the
|
|
// system by calling the SetUnhandledExceptionFilter function
|
|
// and the client code should explicitly request dump generation.
|
|
class CrashGenerationClient {
|
|
public:
|
|
CrashGenerationClient(const wchar_t* pipe_name,
|
|
MINIDUMP_TYPE dump_type,
|
|
const CustomClientInfo* custom_info);
|
|
|
|
CrashGenerationClient(HANDLE pipe_handle,
|
|
MINIDUMP_TYPE dump_type,
|
|
const CustomClientInfo* custom_info);
|
|
|
|
~CrashGenerationClient();
|
|
|
|
// Registers the client process with the crash server.
|
|
//
|
|
// Returns true if the registration is successful; false otherwise.
|
|
bool Register();
|
|
|
|
// Requests the crash server to upload a previous dump with the
|
|
// given crash id.
|
|
bool RequestUpload(DWORD crash_id);
|
|
|
|
bool RequestDump(EXCEPTION_POINTERS* ex_info,
|
|
MDRawAssertionInfo* assert_info);
|
|
|
|
// Requests the crash server to generate a dump with the given
|
|
// exception information.
|
|
//
|
|
// Returns true if the dump was successful; false otherwise. Note that
|
|
// if the registration step was not performed or it was not successful,
|
|
// false will be returned.
|
|
bool RequestDump(EXCEPTION_POINTERS* ex_info);
|
|
|
|
// Requests the crash server to generate a dump with the given
|
|
// assertion information.
|
|
//
|
|
// Returns true if the dump was successful; false otherwise. Note that
|
|
// if the registration step was not performed or it was not successful,
|
|
// false will be returned.
|
|
bool RequestDump(MDRawAssertionInfo* assert_info);
|
|
|
|
// If the crash generation client is running in a sandbox that prevents it
|
|
// from opening the named pipe directly, the server process may open the
|
|
// handle and duplicate it into the client process with this helper method.
|
|
// Returns INVALID_HANDLE_VALUE on failure. The process must have been opened
|
|
// with the PROCESS_DUP_HANDLE access right.
|
|
static HANDLE DuplicatePipeToClientProcess(const wchar_t* pipe_name,
|
|
HANDLE hProcess);
|
|
|
|
private:
|
|
// Connects to the appropriate pipe and sets the pipe handle state.
|
|
//
|
|
// Returns the pipe handle if everything goes well; otherwise Returns NULL.
|
|
HANDLE ConnectToServer();
|
|
|
|
// Performs a handshake with the server over the given pipe which should be
|
|
// already connected to the server.
|
|
//
|
|
// Returns true if handshake with the server was successful; false otherwise.
|
|
bool RegisterClient(HANDLE pipe);
|
|
|
|
// Validates the given server response.
|
|
bool ValidateResponse(const ProtocolMessage& msg) const;
|
|
|
|
// Returns true if the registration step succeeded; false otherwise.
|
|
bool IsRegistered() const;
|
|
|
|
// Connects to the given named pipe with given parameters.
|
|
//
|
|
// Returns true if the connection is successful; false otherwise.
|
|
HANDLE ConnectToPipe(const wchar_t* pipe_name,
|
|
DWORD pipe_access,
|
|
DWORD flags_attrs);
|
|
|
|
// Signals the crash event and wait for the server to generate crash.
|
|
bool SignalCrashEventAndWait();
|
|
|
|
// Pipe name to use to talk to server.
|
|
std::wstring pipe_name_;
|
|
|
|
// Pipe handle duplicated from server process. Only valid before
|
|
// Register is called.
|
|
HANDLE pipe_handle_;
|
|
|
|
// Custom client information
|
|
CustomClientInfo custom_info_;
|
|
|
|
// Type of dump to generate.
|
|
MINIDUMP_TYPE dump_type_;
|
|
|
|
// Event to signal in case of a crash.
|
|
HANDLE crash_event_;
|
|
|
|
// Handle to wait on after signaling a crash for the server
|
|
// to finish generating crash dump.
|
|
HANDLE crash_generated_;
|
|
|
|
// Handle to a mutex that will become signaled with WAIT_ABANDONED
|
|
// if the server process goes down.
|
|
HANDLE server_alive_;
|
|
|
|
// Server process id.
|
|
DWORD server_process_id_;
|
|
|
|
// Id of the thread that caused the crash.
|
|
DWORD thread_id_;
|
|
|
|
// Exception pointers for an exception crash.
|
|
EXCEPTION_POINTERS* exception_pointers_;
|
|
|
|
// Assertion info for an invalid parameter or pure call crash.
|
|
MDRawAssertionInfo assert_info_;
|
|
|
|
// Disable copy ctor and operator=.
|
|
CrashGenerationClient(const CrashGenerationClient& crash_client);
|
|
CrashGenerationClient& operator=(const CrashGenerationClient& crash_client);
|
|
};
|
|
|
|
} // namespace google_breakpad
|
|
|
|
#endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
|