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

Side by Side Diff: client/mac/Framework/Breakpad.mm

Issue 571523004: Mac: Add support for in-process crash reporting (Closed) Base URL: https://chromium.googlesource.com/external/google-breakpad/src.git@master
Patch Set: Created 6 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 | « client/mac/Framework/Breakpad.h ('k') | client/mac/crash_generation/ConfigFile.mm » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006, Google Inc. 1 // Copyright (c) 2006, Google Inc.
2 // All rights reserved. 2 // All rights reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // * Redistributions of source code must retain the above copyright 8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer. 9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above 10 // * Redistributions in binary form must reproduce the above
(...skipping 26 matching lines...) Expand all
37 #import <Foundation/Foundation.h> 37 #import <Foundation/Foundation.h>
38 #include <pthread.h> 38 #include <pthread.h>
39 #include <sys/stat.h> 39 #include <sys/stat.h>
40 #include <sys/sysctl.h> 40 #include <sys/sysctl.h>
41 41
42 #import "client/mac/crash_generation/Inspector.h" 42 #import "client/mac/crash_generation/Inspector.h"
43 #import "client/mac/handler/exception_handler.h" 43 #import "client/mac/handler/exception_handler.h"
44 #import "client/mac/Framework/Breakpad.h" 44 #import "client/mac/Framework/Breakpad.h"
45 #import "client/mac/Framework/OnDemandServer.h" 45 #import "client/mac/Framework/OnDemandServer.h"
46 #import "client/mac/handler/protected_memory_allocator.h" 46 #import "client/mac/handler/protected_memory_allocator.h"
47 #include "common/mac/launch_reporter.h"
47 #import "common/mac/MachIPC.h" 48 #import "common/mac/MachIPC.h"
48 #import "common/simple_string_dictionary.h" 49 #import "common/simple_string_dictionary.h"
49 50
50 #ifndef __EXCEPTIONS 51 #ifndef __EXCEPTIONS
51 // This file uses C++ try/catch (but shouldn't). Duplicate the macros from 52 // This file uses C++ try/catch (but shouldn't). Duplicate the macros from
52 // <c++/4.2.1/exception_defines.h> allowing this file to work properly with 53 // <c++/4.2.1/exception_defines.h> allowing this file to work properly with
53 // exceptions disabled even when other C++ libraries are used. #undef the try 54 // exceptions disabled even when other C++ libraries are used. #undef the try
54 // and catch macros first in case libstdc++ is in use and has already provided 55 // and catch macros first in case libstdc++ is in use and has already provided
55 // its own definitions. 56 // its own definitions.
56 #undef try 57 #undef try
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 Breakpad() 167 Breakpad()
167 : handler_(NULL), 168 : handler_(NULL),
168 config_params_(NULL), 169 config_params_(NULL),
169 send_and_exit_(true), 170 send_and_exit_(true),
170 filter_callback_(NULL), 171 filter_callback_(NULL),
171 filter_callback_context_(NULL) { 172 filter_callback_context_(NULL) {
172 inspector_path_[0] = 0; 173 inspector_path_[0] = 0;
173 } 174 }
174 175
175 bool Initialize(NSDictionary *parameters); 176 bool Initialize(NSDictionary *parameters);
177 bool InitializeInProcess(NSDictionary *parameters);
178 bool InitializeOutOfProcess(NSDictionary *parameters);
176 179
177 bool ExtractParameters(NSDictionary *parameters); 180 bool ExtractParameters(NSDictionary *parameters);
178 181
179 // Dispatches to HandleException() 182 // Dispatches to HandleException()
180 static bool ExceptionHandlerDirectCallback(void *context, 183 static bool ExceptionHandlerDirectCallback(void *context,
181 int exception_type, 184 int exception_type,
182 int exception_code, 185 int exception_code,
183 int exception_subcode, 186 int exception_subcode,
184 mach_port_t crashing_thread); 187 mach_port_t crashing_thread);
185 188
186 bool HandleException(int exception_type, 189 bool HandleException(int exception_type,
187 int exception_code, 190 int exception_code,
188 int exception_subcode, 191 int exception_subcode,
189 mach_port_t crashing_thread); 192 mach_port_t crashing_thread);
190 193
194 // Dispatches to HandleMinidump().
195 // This gets called instead of ExceptionHandlerDirectCallback when running
196 // with the BREAKPAD_IN_PROCESS option.
197 static bool HandleMinidumpCallback(const char *dump_dir,
198 const char *minidump_id,
199 void *context,
200 bool succeeded);
201
202 // This is only used when BREAKPAD_IN_PROCESS is YES.
203 bool HandleMinidump(const char *dump_dir, const char *minidump_id);
204
191 // Since ExceptionHandler (w/o namespace) is defined as typedef in OSX's 205 // Since ExceptionHandler (w/o namespace) is defined as typedef in OSX's
192 // MachineExceptions.h, we have to explicitly name the handler. 206 // MachineExceptions.h, we have to explicitly name the handler.
193 google_breakpad::ExceptionHandler *handler_; // The actual handler (STRONG) 207 google_breakpad::ExceptionHandler *handler_; // The actual handler (STRONG)
194 208
195 char inspector_path_[PATH_MAX]; // Path to inspector tool 209 char inspector_path_[PATH_MAX]; // Path to inspector tool
196 210
197 SimpleStringDictionary *config_params_; // Create parameters (STRONG) 211 SimpleStringDictionary *config_params_; // Create parameters (STRONG)
198 212
199 OnDemandServer inspector_; 213 OnDemandServer inspector_;
200 214
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 if (!breakpad) 273 if (!breakpad)
260 return false; 274 return false;
261 275
262 return breakpad->HandleException( exception_type, 276 return breakpad->HandleException( exception_type,
263 exception_code, 277 exception_code,
264 exception_subcode, 278 exception_subcode,
265 crashing_thread); 279 crashing_thread);
266 } 280 }
267 281
268 //============================================================================= 282 //=============================================================================
283 bool Breakpad::HandleMinidumpCallback(const char *dump_dir,
284 const char *minidump_id,
285 void *context,
286 bool succeeded) {
287 Breakpad *breakpad = (Breakpad *)context;
288
289 // If our context is damaged or something, just return false to indicate that
290 // the handler should continue without us.
291 if (!breakpad || !succeeded)
292 return false;
293
294 return breakpad->HandleMinidump(dump_dir, minidump_id);
295 }
296
297 //=============================================================================
269 #pragma mark - 298 #pragma mark -
270 299
271 #include <dlfcn.h> 300 #include <dlfcn.h>
272 301
273 //============================================================================= 302 //=============================================================================
274 // Returns the pathname to the Resources directory for this version of 303 // Returns the pathname to the Resources directory for this version of
275 // Breakpad which we are now running. 304 // Breakpad which we are now running.
276 // 305 //
277 // Don't make the function static, since _dyld_lookup_and_bind_fully needs a 306 // Don't make the function static, since _dyld_lookup_and_bind_fully needs a
278 // simple non-static C name 307 // simple non-static C name
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 // Check for debugger 348 // Check for debugger
320 if (IsDebuggerActive()) { 349 if (IsDebuggerActive()) {
321 return true; 350 return true;
322 } 351 }
323 352
324 // Gather any user specified parameters 353 // Gather any user specified parameters
325 if (!ExtractParameters(parameters)) { 354 if (!ExtractParameters(parameters)) {
326 return false; 355 return false;
327 } 356 }
328 357
358 if ([[parameters objectForKey:@BREAKPAD_IN_PROCESS] boolValue])
359 return InitializeInProcess(parameters);
360 else
361 return InitializeOutOfProcess(parameters);
362 }
363
364 //=============================================================================
365 bool Breakpad::InitializeInProcess(NSDictionary* parameters) {
366 handler_ =
367 new (gBreakpadAllocator->Allocate(
368 sizeof(google_breakpad::ExceptionHandler)))
369 google_breakpad::ExceptionHandler(
370 config_params_->GetValueForKey(BREAKPAD_DUMP_DIRECTORY),
371 0, &HandleMinidumpCallback, this, true, 0);
372 return true;
373 }
374
375 //=============================================================================
376 bool Breakpad::InitializeOutOfProcess(NSDictionary* parameters) {
329 // Get path to Inspector executable. 377 // Get path to Inspector executable.
330 NSString *inspectorPathString = KeyValue(@BREAKPAD_INSPECTOR_LOCATION); 378 NSString *inspectorPathString = KeyValue(@BREAKPAD_INSPECTOR_LOCATION);
331 379
332 // Standardize path (resolve symlinkes, etc.) and escape spaces 380 // Standardize path (resolve symlinkes, etc.) and escape spaces
333 inspectorPathString = [inspectorPathString stringByStandardizingPath]; 381 inspectorPathString = [inspectorPathString stringByStandardizingPath];
334 inspectorPathString = [[inspectorPathString componentsSeparatedByString:@" "] 382 inspectorPathString = [[inspectorPathString componentsSeparatedByString:@" "]
335 componentsJoinedByString:@"\\ "]; 383 componentsJoinedByString:@"\\ "];
336 384
337 // Create an on-demand server object representing the Inspector. 385 // Create an on-demand server object representing the Inspector.
338 // In case of a crash, we simply need to call the LaunchOnDemand() 386 // In case of a crash, we simply need to call the LaunchOnDemand()
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
704 #endif 752 #endif
705 753
706 // If we don't want any forwarding, return true here to indicate that we've 754 // If we don't want any forwarding, return true here to indicate that we've
707 // processed things as much as we want. 755 // processed things as much as we want.
708 if (send_and_exit_) return true; 756 if (send_and_exit_) return true;
709 757
710 return false; 758 return false;
711 } 759 }
712 760
713 //============================================================================= 761 //=============================================================================
762 bool Breakpad::HandleMinidump(const char *dump_dir, const char *minidump_id) {
763 google_breakpad::ConfigFile config_file;
764 config_file.WriteFile(dump_dir, config_params_, dump_dir, minidump_id);
765 google_breakpad::LaunchReporter(
766 config_params_->GetValueForKey(BREAKPAD_REPORTER_EXE_LOCATION),
767 config_file.GetFilePath());
768 return true;
769 }
770
771 //=============================================================================
714 //============================================================================= 772 //=============================================================================
715 773
716 #pragma mark - 774 #pragma mark -
717 #pragma mark Public API 775 #pragma mark Public API
718 776
719 //============================================================================= 777 //=============================================================================
720 BreakpadRef BreakpadCreate(NSDictionary *parameters) { 778 BreakpadRef BreakpadCreate(NSDictionary *parameters) {
721 try { 779 try {
722 // This is confusing. Our two main allocators for breakpad memory are: 780 // This is confusing. Our two main allocators for breakpad memory are:
723 // - gKeyValueAllocator for the key/value memory 781 // - gKeyValueAllocator for the key/value memory
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
976 } 1034 }
977 logFileCounter++; 1035 logFileCounter++;
978 logFileKey = [NSString stringWithFormat:@"%@%d", 1036 logFileKey = [NSString stringWithFormat:@"%@%d",
979 @BREAKPAD_LOGFILE_KEY_PREFIX, 1037 @BREAKPAD_LOGFILE_KEY_PREFIX,
980 logFileCounter]; 1038 logFileCounter];
981 existingLogFilename = BreakpadKeyValue(ref, logFileKey); 1039 existingLogFilename = BreakpadKeyValue(ref, logFileKey);
982 } 1040 }
983 1041
984 BreakpadSetKeyValue(ref, logFileKey, logPathname); 1042 BreakpadSetKeyValue(ref, logFileKey, logPathname);
985 } 1043 }
OLDNEW
« no previous file with comments | « client/mac/Framework/Breakpad.h ('k') | client/mac/crash_generation/ConfigFile.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698