Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(681)

Side by Side Diff: third_party/crashpad/crashpad/handler/handler_main.cc

Issue 2308763002: Integrate Crashpad UMA (Closed)
Patch Set: . Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/crashpad/crashpad/client/crashpad_client_win.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Crashpad Authors. All rights reserved. 1 // Copyright 2014 The Crashpad Authors. All rights reserved.
2 // 2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License. 4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at 5 // You may obtain a copy of the License at
6 // 6 //
7 // http://www.apache.org/licenses/LICENSE-2.0 7 // http://www.apache.org/licenses/LICENSE-2.0
8 // 8 //
9 // Unless required by applicable law or agreed to in writing, software 9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, 10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and 12 // See the License for the specific language governing permissions and
13 // limitations under the License. 13 // limitations under the License.
14 14
15 #include "handler/handler_main.h" 15 #include "handler/handler_main.h"
16 16
17 #include <getopt.h> 17 #include <getopt.h>
18 #include <stdint.h> 18 #include <stdint.h>
19 #include <stdlib.h> 19 #include <stdlib.h>
20 20
21 #include <map> 21 #include <map>
22 #include <memory> 22 #include <memory>
23 #include <string> 23 #include <string>
24 #include <utility> 24 #include <utility>
25 25
26 #include "base/auto_reset.h" 26 #include "base/auto_reset.h"
27 #include "base/files/file_path.h" 27 #include "base/files/file_path.h"
28 #include "base/files/scoped_file.h" 28 #include "base/files/scoped_file.h"
29 #include "base/logging.h" 29 #include "base/logging.h"
30 #include "base/metrics/persistent_histogram_allocator.h"
30 #include "base/scoped_generic.h" 31 #include "base/scoped_generic.h"
31 #include "base/strings/utf_string_conversions.h" 32 #include "base/strings/utf_string_conversions.h"
32 #include "build/build_config.h" 33 #include "build/build_config.h"
33 #include "client/crash_report_database.h" 34 #include "client/crash_report_database.h"
34 #include "client/crashpad_client.h" 35 #include "client/crashpad_client.h"
35 #include "client/prune_crash_reports.h" 36 #include "client/prune_crash_reports.h"
36 #include "handler/crash_report_upload_thread.h" 37 #include "handler/crash_report_upload_thread.h"
37 #include "handler/prune_crash_reports_thread.h" 38 #include "handler/prune_crash_reports_thread.h"
38 #include "tools/tool_support.h" 39 #include "tools/tool_support.h"
39 #include "util/file/file_io.h" 40 #include "util/file/file_io.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 "\n" 72 "\n"
72 " --annotation=KEY=VALUE set a process annotation in each crash report\n" 73 " --annotation=KEY=VALUE set a process annotation in each crash report\n"
73 " --database=PATH store the crash report database at PATH\n" 74 " --database=PATH store the crash report database at PATH\n"
74 #if defined(OS_MACOSX) 75 #if defined(OS_MACOSX)
75 " --handshake-fd=FD establish communication with the client over FD\n " 76 " --handshake-fd=FD establish communication with the client over FD\n "
76 " --mach-service=SERVICE register SERVICE with the bootstrap server\n" 77 " --mach-service=SERVICE register SERVICE with the bootstrap server\n"
77 #elif defined(OS_WIN) 78 #elif defined(OS_WIN)
78 " --handshake-handle=HANDLE\n" 79 " --handshake-handle=HANDLE\n"
79 " create a new pipe and send its name via HANDLE\n" 80 " create a new pipe and send its name via HANDLE\n"
80 #endif // OS_MACOSX 81 #endif // OS_MACOSX
82 " --metrics-dir=DIR store metrics files in DIR (only in Chromium)\n"
81 " --no-rate-limit don't rate limit crash uploads\n" 83 " --no-rate-limit don't rate limit crash uploads\n"
82 #if defined(OS_MACOSX) 84 #if defined(OS_MACOSX)
83 " --reset-own-crash-exception-port-to-system-default\n" 85 " --reset-own-crash-exception-port-to-system-default\n"
84 " reset the server's exception handler to default\n " 86 " reset the server's exception handler to default\n "
85 #elif defined(OS_WIN) 87 #elif defined(OS_WIN)
86 " --pipe-name=PIPE communicate with the client over PIPE\n" 88 " --pipe-name=PIPE communicate with the client over PIPE\n"
87 #endif // OS_MACOSX 89 #endif // OS_MACOSX
88 " --url=URL send crash reports to this Breakpad server URL,\n " 90 " --url=URL send crash reports to this Breakpad server URL,\n "
89 " only if uploads are enabled for the database\n" 91 " only if uploads are enabled for the database\n"
90 " --help display this help and exit\n" 92 " --help display this help and exit\n"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 // Long options without short equivalents. 131 // Long options without short equivalents.
130 kOptionLastChar = 255, 132 kOptionLastChar = 255,
131 kOptionAnnotation, 133 kOptionAnnotation,
132 kOptionDatabase, 134 kOptionDatabase,
133 #if defined(OS_MACOSX) 135 #if defined(OS_MACOSX)
134 kOptionHandshakeFD, 136 kOptionHandshakeFD,
135 kOptionMachService, 137 kOptionMachService,
136 #elif defined(OS_WIN) 138 #elif defined(OS_WIN)
137 kOptionHandshakeHandle, 139 kOptionHandshakeHandle,
138 #endif // OS_MACOSX 140 #endif // OS_MACOSX
141 kOptionMetrics,
139 kOptionNoRateLimit, 142 kOptionNoRateLimit,
140 #if defined(OS_MACOSX) 143 #if defined(OS_MACOSX)
141 kOptionResetOwnCrashExceptionPortToSystemDefault, 144 kOptionResetOwnCrashExceptionPortToSystemDefault,
142 #elif defined(OS_WIN) 145 #elif defined(OS_WIN)
143 kOptionPipeName, 146 kOptionPipeName,
144 #endif // OS_MACOSX 147 #endif // OS_MACOSX
145 kOptionURL, 148 kOptionURL,
146 149
147 // Standard options. 150 // Standard options.
148 kOptionHelp = -2, 151 kOptionHelp = -2,
149 kOptionVersion = -3, 152 kOptionVersion = -3,
150 }; 153 };
151 154
152 struct { 155 struct {
153 std::map<std::string, std::string> annotations; 156 std::map<std::string, std::string> annotations;
154 std::string url; 157 std::string url;
155 const char* database; 158 const char* database;
159 const char* metrics;
156 #if defined(OS_MACOSX) 160 #if defined(OS_MACOSX)
157 int handshake_fd; 161 int handshake_fd;
158 std::string mach_service; 162 std::string mach_service;
159 bool reset_own_crash_exception_port_to_system_default; 163 bool reset_own_crash_exception_port_to_system_default;
160 #elif defined(OS_WIN) 164 #elif defined(OS_WIN)
161 HANDLE handshake_handle; 165 HANDLE handshake_handle;
162 std::string pipe_name; 166 std::string pipe_name;
163 #endif // OS_MACOSX 167 #endif // OS_MACOSX
164 bool rate_limit; 168 bool rate_limit;
165 } options = {}; 169 } options = {};
166 #if defined(OS_MACOSX) 170 #if defined(OS_MACOSX)
167 options.handshake_fd = -1; 171 options.handshake_fd = -1;
168 #elif defined(OS_WIN) 172 #elif defined(OS_WIN)
169 options.handshake_handle = INVALID_HANDLE_VALUE; 173 options.handshake_handle = INVALID_HANDLE_VALUE;
170 #endif 174 #endif
171 options.rate_limit = true; 175 options.rate_limit = true;
172 176
173 const option long_options[] = { 177 const option long_options[] = {
174 {"annotation", required_argument, nullptr, kOptionAnnotation}, 178 {"annotation", required_argument, nullptr, kOptionAnnotation},
175 {"database", required_argument, nullptr, kOptionDatabase}, 179 {"database", required_argument, nullptr, kOptionDatabase},
176 #if defined(OS_MACOSX) 180 #if defined(OS_MACOSX)
177 {"handshake-fd", required_argument, nullptr, kOptionHandshakeFD}, 181 {"handshake-fd", required_argument, nullptr, kOptionHandshakeFD},
178 {"mach-service", required_argument, nullptr, kOptionMachService}, 182 {"mach-service", required_argument, nullptr, kOptionMachService},
179 #elif defined(OS_WIN) 183 #elif defined(OS_WIN)
180 {"handshake-handle", required_argument, nullptr, kOptionHandshakeHandle}, 184 {"handshake-handle", required_argument, nullptr, kOptionHandshakeHandle},
181 #endif // OS_MACOSX 185 #endif // OS_MACOSX
186 {"metrics", required_argument, nullptr, kOptionMetrics},
182 {"no-rate-limit", no_argument, nullptr, kOptionNoRateLimit}, 187 {"no-rate-limit", no_argument, nullptr, kOptionNoRateLimit},
183 #if defined(OS_MACOSX) 188 #if defined(OS_MACOSX)
184 {"reset-own-crash-exception-port-to-system-default", 189 {"reset-own-crash-exception-port-to-system-default",
185 no_argument, 190 no_argument,
186 nullptr, 191 nullptr,
187 kOptionResetOwnCrashExceptionPortToSystemDefault}, 192 kOptionResetOwnCrashExceptionPortToSystemDefault},
188 #elif defined(OS_WIN) 193 #elif defined(OS_WIN)
189 {"pipe-name", required_argument, nullptr, kOptionPipeName}, 194 {"pipe-name", required_argument, nullptr, kOptionPipeName},
190 #endif // OS_MACOSX 195 #endif // OS_MACOSX
191 {"url", required_argument, nullptr, kOptionURL}, 196 {"url", required_argument, nullptr, kOptionURL},
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 unsigned int handle_uint; 241 unsigned int handle_uint;
237 if (!StringToNumber(optarg, &handle_uint) || 242 if (!StringToNumber(optarg, &handle_uint) ||
238 (options.handshake_handle = IntToHandle(handle_uint)) == 243 (options.handshake_handle = IntToHandle(handle_uint)) ==
239 INVALID_HANDLE_VALUE) { 244 INVALID_HANDLE_VALUE) {
240 ToolSupport::UsageHint(me, "--handshake-handle requires a HANDLE"); 245 ToolSupport::UsageHint(me, "--handshake-handle requires a HANDLE");
241 return EXIT_FAILURE; 246 return EXIT_FAILURE;
242 } 247 }
243 break; 248 break;
244 } 249 }
245 #endif // OS_MACOSX 250 #endif // OS_MACOSX
251 case kOptionMetrics: {
252 options.metrics = optarg;
253 break;
254 }
246 case kOptionNoRateLimit: { 255 case kOptionNoRateLimit: {
247 options.rate_limit = false; 256 options.rate_limit = false;
248 break; 257 break;
249 } 258 }
250 #if defined(OS_MACOSX) 259 #if defined(OS_MACOSX)
251 case kOptionResetOwnCrashExceptionPortToSystemDefault: { 260 case kOptionResetOwnCrashExceptionPortToSystemDefault: {
252 options.reset_own_crash_exception_port_to_system_default = true; 261 options.reset_own_crash_exception_port_to_system_default = true;
253 break; 262 break;
254 } 263 }
255 #elif defined(OS_WIN) 264 #elif defined(OS_WIN)
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 return EXIT_FAILURE; 388 return EXIT_FAILURE;
380 } 389 }
381 if (!LoggingWriteFile(options.handshake_handle, 390 if (!LoggingWriteFile(options.handshake_handle,
382 pipe_name.c_str(), 391 pipe_name.c_str(),
383 pipe_name.size() * sizeof(pipe_name[0]))) { 392 pipe_name.size() * sizeof(pipe_name[0]))) {
384 return EXIT_FAILURE; 393 return EXIT_FAILURE;
385 } 394 }
386 } 395 }
387 #endif // OS_MACOSX 396 #endif // OS_MACOSX
388 397
398 base::GlobalHistogramAllocator* histogram_allocator = nullptr;
399 if (options.metrics) {
400 const base::FilePath metrics_dir(
401 ToolSupport::CommandLineArgumentToFilePathStringType(options.metrics));
402 const char kMetricsName[] = "CrashpadMetrics";
403 if (base::GlobalHistogramAllocator::CreateWithActiveFileInDir(
404 metrics_dir, 1 << 20, 0, kMetricsName)) {
405 histogram_allocator = base::GlobalHistogramAllocator::Get();
406 histogram_allocator->CreateTrackingHistograms(kMetricsName);
407 }
408 }
409
389 std::unique_ptr<CrashReportDatabase> database(CrashReportDatabase::Initialize( 410 std::unique_ptr<CrashReportDatabase> database(CrashReportDatabase::Initialize(
390 base::FilePath(ToolSupport::CommandLineArgumentToFilePathStringType( 411 base::FilePath(ToolSupport::CommandLineArgumentToFilePathStringType(
391 options.database)))); 412 options.database))));
392 if (!database) { 413 if (!database) {
393 return EXIT_FAILURE; 414 return EXIT_FAILURE;
394 } 415 }
395 416
396 // TODO(scottmg): options.rate_limit should be removed when we have a 417 // TODO(scottmg): options.rate_limit should be removed when we have a
397 // configurable database setting to control upload limiting. 418 // configurable database setting to control upload limiting.
398 // See https://crashpad.chromium.org/bug/23. 419 // See https://crashpad.chromium.org/bug/23.
399 CrashReportUploadThread upload_thread( 420 CrashReportUploadThread upload_thread(
400 database.get(), options.url, options.rate_limit); 421 database.get(), options.url, options.rate_limit);
401 upload_thread.Start(); 422 upload_thread.Start();
402 423
403 PruneCrashReportThread prune_thread(database.get(), 424 PruneCrashReportThread prune_thread(database.get(),
404 PruneCondition::GetDefault()); 425 PruneCondition::GetDefault());
405 prune_thread.Start(); 426 prune_thread.Start();
406 427
407 CrashReportExceptionHandler exception_handler( 428 CrashReportExceptionHandler exception_handler(
408 database.get(), &upload_thread, &options.annotations); 429 database.get(), &upload_thread, &options.annotations);
409 430
410 exception_handler_server.Run(&exception_handler); 431 exception_handler_server.Run(&exception_handler);
411 432
412 upload_thread.Stop(); 433 upload_thread.Stop();
413 prune_thread.Stop(); 434 prune_thread.Stop();
414 435
436 if (histogram_allocator)
437 histogram_allocator->DeletePersistentLocation();
Mark Mentovai 2016/09/15 00:08:55 Optional: consider a scoper to do this instead. Th
scottmg 2016/09/15 00:14:47 I wonder if we shouldn't do that, so that we gathe
438
415 return EXIT_SUCCESS; 439 return EXIT_SUCCESS;
416 } 440 }
417 441
418 } // namespace crashpad 442 } // namespace crashpad
OLDNEW
« no previous file with comments | « third_party/crashpad/crashpad/client/crashpad_client_win.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698