win: Add CrashpadClient::GetHandlerIPCPipe()

For multiprocess architectures, this method allows the pipe used for
registration to be obtained from CrashpadHandler, even when
CrashpadHandler chooses its own name. This may happen if the handler is
not running on a well-known pipe name but was instead started by
CrashpadHandler::StartHandler(). If Chrome uses this interface, for
example, the browser process will need to call
CrashpadClient::GetHandlerIPCPipe() and pass the pipe name to its child
processes.

R=scottmg@chromium.org

Review URL: https://codereview.chromium.org/1427163004 .
This commit is contained in:
Mark Mentovai 2015-11-02 23:15:22 -05:00
parent 7f939285de
commit a30db914af
2 changed files with 21 additions and 5 deletions

View File

@ -72,22 +72,33 @@ class CrashpadClient {
const std::vector<std::string>& arguments);
#if defined(OS_WIN) || DOXYGEN
//! \brief Sets the IPC port of a presumably-running Crashpad handler process
//! \brief Sets the IPC pipe of a presumably-running Crashpad handler process
//! which was started with StartHandler() or by other compatible means
//! and does an IPC message exchange to register this process with the
//! handler. However, just like StartHandler(), crashes are not serviced
//! until UseHandler() is called.
//!
//! The IPC port name (somehow) encodes enough information so that
//! registration is done with a crash handler using the appropriate database
//! and upload server.
//!
//! \param[in] ipc_pipe The full name of the crash handler IPC pipe. This is
//! a string of the form `&quot;\\.\pipe\NAME&quot;`.
//!
//! \return `true` on success and `false` on failure.
bool SetHandlerIPCPipe(const std::wstring& ipc_pipe);
//! \brief Retrieves the IPC pipe name used to register with the Crashpad
//! handler.
//!
//! This method retrieves the IPC pipe name set by SetHandlerIPCPipe(), or a
//! suitable IPC pipe name chosen by StartHandler(). It is intended to be used
//! to obtain the IPC pipe name so that it may be passed to other processes,
//! so that they may register with an existing Crashpad handler by calling
//! SetHandlerIPCPipe().
//!
//! This method is only defined on Windows.
//!
//! \return The full name of the crash handler IPC pipe, a string of the form
//! `&quot;\\.\pipe\NAME&quot;`.
std::wstring GetHandlerIPCPipe() const;
//! \brief Requests that the handler capture a dump even though there hasn't
//! been a crash.
//!

View File

@ -200,6 +200,11 @@ bool CrashpadClient::SetHandlerIPCPipe(const std::wstring& ipc_pipe) {
return true;
}
std::wstring CrashpadClient::GetHandlerIPCPipe() const {
DCHECK(!ipc_pipe_.empty());
return ipc_pipe_;
}
bool CrashpadClient::UseHandler() {
DCHECK(!ipc_pipe_.empty());
DCHECK_EQ(g_signal_exception, INVALID_HANDLE_VALUE);