Index: components/crash/content/app/run_as_crashpad_handler_win.cc |
diff --git a/components/crash/content/app/run_as_crashpad_handler_win.cc b/components/crash/content/app/run_as_crashpad_handler_win.cc |
index 20be2d108cf68043bd69d11ccc3318d189d18c2d..f42946a43e3784c5e0c5e7cb30f25e29b2f9f3bf 100644 |
--- a/components/crash/content/app/run_as_crashpad_handler_win.cc |
+++ b/components/crash/content/app/run_as_crashpad_handler_win.cc |
@@ -14,25 +14,45 @@ |
#include "base/strings/string16.h" |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "third_party/crashpad/crashpad/client/crashpad_info.h" |
+#include "third_party/crashpad/crashpad/client/simple_string_dictionary.h" |
#include "third_party/crashpad/crashpad/handler/handler_main.h" |
namespace crash_reporter { |
-int RunAsCrashpadHandler(const base::CommandLine& command_line) { |
+int RunAsCrashpadHandler(const base::CommandLine& command_line, |
+ const char* process_type_switch) { |
// Make sure this process terminates on OOM in the same mode as other Chrome |
// processes. |
base::EnableTerminationOnOutOfMemory(); |
+ // If the handler is started with --monitor-self, it'll need a ptype |
+ // annotation set. It'll normally set one itself by being invoked with |
+ // --monitor-self-annotation=ptype=crashpad-handler, but that leaves a window |
+ // during self-monitoring initialization when the ptype is not set at all, so |
+ // provide one here. |
+ const std::string process_type = |
+ command_line.GetSwitchValueASCII(process_type_switch); |
+ if (!process_type.empty()) { |
+ crashpad::SimpleStringDictionary* annotations = |
+ new crashpad::SimpleStringDictionary(); |
+ annotations->SetKeyValue("ptype", process_type.c_str()); |
+ crashpad::CrashpadInfo* crashpad_info = |
+ crashpad::CrashpadInfo::GetCrashpadInfo(); |
+ crashpad_info->set_simple_annotations(annotations); |
+ } |
+ |
std::vector<base::string16> argv = command_line.argv(); |
- const base::string16 process_type = L"--type="; |
- argv.erase(std::remove_if(argv.begin(), argv.end(), |
- [&process_type](const base::string16& str) { |
- return base::StartsWith( |
- str, process_type, |
- base::CompareCase::SENSITIVE) || |
- (!str.empty() && str[0] == L'/'); |
- }), |
- argv.end()); |
+ const base::string16 process_type_arg_prefix = |
+ base::string16(L"--") + base::UTF8ToUTF16(process_type_switch) + L"="; |
+ argv.erase( |
+ std::remove_if(argv.begin(), argv.end(), |
+ [&process_type_arg_prefix](const base::string16& str) { |
+ return base::StartsWith(str, process_type_arg_prefix, |
+ base::CompareCase::SENSITIVE) || |
+ (!str.empty() && str[0] == L'/'); |
+ }), |
+ argv.end()); |
std::unique_ptr<char* []> argv_as_utf8(new char*[argv.size() + 1]); |
std::vector<std::string> storage; |