Index: third_party/crashpad/crashpad/handler/handler_main.cc |
diff --git a/third_party/crashpad/crashpad/handler/handler_main.cc b/third_party/crashpad/crashpad/handler/handler_main.cc |
index 8749c5836357fa0870162fb028fa29a34b110f10..29c5ddc14e6c4a26b7842eebb813b00f7c5a2eec 100644 |
--- a/third_party/crashpad/crashpad/handler/handler_main.cc |
+++ b/third_party/crashpad/crashpad/handler/handler_main.cc |
@@ -59,6 +59,7 @@ |
#include "handler/win/crash_report_exception_handler.h" |
#include "util/win/exception_handler_server.h" |
#include "util/win/handle.h" |
+#include "util/win/initial_client_data.h" |
#endif // OS_MACOSX |
namespace crashpad { |
@@ -76,8 +77,15 @@ void Usage(const base::FilePath& me) { |
" --handshake-fd=FD establish communication with the client over FD\n" |
" --mach-service=SERVICE register SERVICE with the bootstrap server\n" |
#elif defined(OS_WIN) |
-" --handshake-handle=HANDLE\n" |
-" create a new pipe and send its name via HANDLE\n" |
+" --initial-client-data=HANDLE_request_crash_dump,\n" |
+" HANDLE_request_non_crash_dump,\n" |
+" HANDLE_non_crash_dump_completed,\n" |
+" HANDLE_pipe,\n" |
+" HANDLE_client_process,\n" |
+" Address_crash_exception_information,\n" |
+" Address_non_crash_exception_information,\n" |
+" Address_debug_critical_section\n" |
+" use precreated data to register initial client\n" |
#endif // OS_MACOSX |
" --metrics-dir=DIR store metrics files in DIR (only in Chromium)\n" |
" --no-rate-limit don't rate limit crash uploads\n" |
@@ -125,7 +133,7 @@ LONG WINAPI UnhandledExceptionHandler(EXCEPTION_POINTERS* exception_pointers) { |
Metrics::HandlerCrashed(exception_pointers->ExceptionRecord->ExceptionCode); |
return EXCEPTION_CONTINUE_SEARCH; |
} |
-#endif |
+#endif // OS_WIN |
} // namespace |
@@ -145,9 +153,12 @@ int HandlerMain(int argc, char* argv[]) { |
kOptionDatabase, |
#if defined(OS_MACOSX) |
kOptionHandshakeFD, |
+#endif // OS_MACOSX |
+#if defined(OS_WIN) |
+ kOptionInitialClientData, |
+#endif // OS_WIN |
+#if defined(OS_MACOSX) |
kOptionMachService, |
-#elif defined(OS_WIN) |
- kOptionHandshakeHandle, |
#endif // OS_MACOSX |
kOptionMetrics, |
kOptionNoRateLimit, |
@@ -173,41 +184,45 @@ int HandlerMain(int argc, char* argv[]) { |
std::string mach_service; |
bool reset_own_crash_exception_port_to_system_default; |
#elif defined(OS_WIN) |
- HANDLE handshake_handle; |
std::string pipe_name; |
+ InitialClientData initial_client_data; |
#endif // OS_MACOSX |
bool rate_limit; |
} options = {}; |
#if defined(OS_MACOSX) |
options.handshake_fd = -1; |
-#elif defined(OS_WIN) |
- options.handshake_handle = INVALID_HANDLE_VALUE; |
#endif |
options.rate_limit = true; |
const option long_options[] = { |
- {"annotation", required_argument, nullptr, kOptionAnnotation}, |
- {"database", required_argument, nullptr, kOptionDatabase}, |
+ {"annotation", required_argument, nullptr, kOptionAnnotation}, |
+ {"database", required_argument, nullptr, kOptionDatabase}, |
#if defined(OS_MACOSX) |
- {"handshake-fd", required_argument, nullptr, kOptionHandshakeFD}, |
- {"mach-service", required_argument, nullptr, kOptionMachService}, |
-#elif defined(OS_WIN) |
- {"handshake-handle", required_argument, nullptr, kOptionHandshakeHandle}, |
+ {"handshake-fd", required_argument, nullptr, kOptionHandshakeFD}, |
+#endif // OS_MACOSX |
+#if defined(OS_WIN) |
+ {"initial-client-data", |
+ required_argument, |
+ nullptr, |
+ kOptionInitialClientData}, |
+#endif // OS_MACOSX |
+#if defined(OS_MACOSX) |
+ {"mach-service", required_argument, nullptr, kOptionMachService}, |
#endif // OS_MACOSX |
- {"metrics-dir", required_argument, nullptr, kOptionMetrics}, |
- {"no-rate-limit", no_argument, nullptr, kOptionNoRateLimit}, |
+ {"metrics-dir", required_argument, nullptr, kOptionMetrics}, |
+ {"no-rate-limit", no_argument, nullptr, kOptionNoRateLimit}, |
#if defined(OS_MACOSX) |
- {"reset-own-crash-exception-port-to-system-default", |
- no_argument, |
- nullptr, |
- kOptionResetOwnCrashExceptionPortToSystemDefault}, |
+ {"reset-own-crash-exception-port-to-system-default", |
+ no_argument, |
+ nullptr, |
+ kOptionResetOwnCrashExceptionPortToSystemDefault}, |
#elif defined(OS_WIN) |
- {"pipe-name", required_argument, nullptr, kOptionPipeName}, |
+ {"pipe-name", required_argument, nullptr, kOptionPipeName}, |
#endif // OS_MACOSX |
- {"url", required_argument, nullptr, kOptionURL}, |
- {"help", no_argument, nullptr, kOptionHelp}, |
- {"version", no_argument, nullptr, kOptionVersion}, |
- {nullptr, 0, nullptr, 0}, |
+ {"url", required_argument, nullptr, kOptionURL}, |
+ {"help", no_argument, nullptr, kOptionHelp}, |
+ {"version", no_argument, nullptr, kOptionVersion}, |
+ {nullptr, 0, nullptr, 0}, |
}; |
int opt; |
@@ -216,7 +231,7 @@ int HandlerMain(int argc, char* argv[]) { |
case kOptionAnnotation: { |
std::string key; |
std::string value; |
- if (!SplitString(optarg, '=', &key, &value)) { |
+ if (!SplitStringFirst(optarg, '=', &key, &value)) { |
ToolSupport::UsageHint(me, "--annotation requires KEY=VALUE"); |
return EXIT_FAILURE; |
} |
@@ -246,14 +261,10 @@ int HandlerMain(int argc, char* argv[]) { |
break; |
} |
#elif defined(OS_WIN) |
- case kOptionHandshakeHandle: { |
- // Use unsigned int, because the handle was presented by the client in |
- // 0x%x format. |
- unsigned int handle_uint; |
- if (!StringToNumber(optarg, &handle_uint) || |
- (options.handshake_handle = IntToHandle(handle_uint)) == |
- INVALID_HANDLE_VALUE) { |
- ToolSupport::UsageHint(me, "--handshake-handle requires a HANDLE"); |
+ case kOptionInitialClientData: { |
+ if (!options.initial_client_data.InitializeFromString(optarg)) { |
+ ToolSupport::UsageHint( |
+ me, "failed to parse --initial-client-data"); |
return EXIT_FAILURE; |
} |
break; |
@@ -310,15 +321,14 @@ int HandlerMain(int argc, char* argv[]) { |
return EXIT_FAILURE; |
} |
#elif defined(OS_WIN) |
- if (options.handshake_handle == INVALID_HANDLE_VALUE && |
- options.pipe_name.empty()) { |
- ToolSupport::UsageHint(me, "--handshake-handle or --pipe-name is required"); |
+ if (!options.initial_client_data.IsValid() && options.pipe_name.empty()) { |
+ ToolSupport::UsageHint(me, |
+ "--initial-client-data or --pipe-name is required"); |
return EXIT_FAILURE; |
} |
- if (options.handshake_handle != INVALID_HANDLE_VALUE && |
- !options.pipe_name.empty()) { |
+ if (options.initial_client_data.IsValid() && !options.pipe_name.empty()) { |
ToolSupport::UsageHint( |
- me, "--handshake-handle and --pipe-name are incompatible"); |
+ me, "--initial-client-data and --pipe-name are incompatible"); |
return EXIT_FAILURE; |
} |
#endif // OS_MACOSX |
@@ -389,20 +399,6 @@ int HandlerMain(int argc, char* argv[]) { |
if (!options.pipe_name.empty()) { |
exception_handler_server.SetPipeName(base::UTF8ToUTF16(options.pipe_name)); |
- } else if (options.handshake_handle != INVALID_HANDLE_VALUE) { |
- std::wstring pipe_name = exception_handler_server.CreatePipe(); |
- |
- uint32_t pipe_name_length = static_cast<uint32_t>(pipe_name.size()); |
- if (!LoggingWriteFile(options.handshake_handle, |
- &pipe_name_length, |
- sizeof(pipe_name_length))) { |
- return EXIT_FAILURE; |
- } |
- if (!LoggingWriteFile(options.handshake_handle, |
- pipe_name.c_str(), |
- pipe_name.size() * sizeof(pipe_name[0]))) { |
- return EXIT_FAILURE; |
- } |
} |
#endif // OS_MACOSX |
@@ -440,6 +436,13 @@ int HandlerMain(int argc, char* argv[]) { |
CrashReportExceptionHandler exception_handler( |
database.get(), &upload_thread, &options.annotations); |
+#if defined(OS_WIN) |
+ if (options.initial_client_data.IsValid()) { |
+ exception_handler_server.InitializeWithInheritedDataForInitialClient( |
+ options.initial_client_data, &exception_handler); |
+ } |
+#endif // OS_WIN |
+ |
exception_handler_server.Run(&exception_handler); |
upload_thread.Stop(); |