diff --git a/breakpad.diff b/breakpad.diff new file mode 100644 index 0000000..ddcddbc --- /dev/null +++ b/breakpad.diff @@ -0,0 +1,651 @@ +diff --git a/src/build/common.gypi b/src/build/common.gypi +index 29990c65..53e99d44 100644 +--- a/src/build/common.gypi ++++ b/src/build/common.gypi +@@ -330,6 +330,7 @@ + 'VCCLCompilerTool': { + 'WarnAsError': 'true', + 'Detect64BitPortabilityProblems': 'false', ++ 'TreatWChar_tAsBuiltInType': 'false', + }, + }, + }], +diff --git a/src/client/mac/Breakpad.xcodeproj/project.pbxproj b/src/client/mac/Breakpad.xcodeproj/project.pbxproj +index 1a93ce6d..b5986e33 100644 +--- a/src/client/mac/Breakpad.xcodeproj/project.pbxproj ++++ b/src/client/mac/Breakpad.xcodeproj/project.pbxproj +@@ -35,6 +35,19 @@ + /* End PBXAggregateTarget section */ + + /* Begin PBXBuildFile section */ ++ 0748C0431C63C409004489BF /* MachIPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53790ECCE635009BE4BA /* MachIPC.mm */; }; ++ 0748C0441C63C43C004489BF /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; }; ++ 0748C0451C63C46C004489BF /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; }; ++ 0748C0461C63C484004489BF /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; }; ++ 0748C0471C63C4A1004489BF /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; }; ++ 0748C0491C63C4CF004489BF /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; }; ++ 0748C04A1C63C4D4004489BF /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; }; ++ 0748C04B1C63C4DB004489BF /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.c */; }; ++ 0748C04C1C63C4EA004489BF /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; }; ++ 0748C04D1C63C50F004489BF /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; }; ++ 0748C04E1C63C51C004489BF /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D72CA0D13DFAD5C006CABE3 /* md5.cc */; }; ++ 0748C04F1C63C523004489BF /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; }; ++ 0748C0501C63C52D004489BF /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; }; + 162F64F2161C577500CD68D5 /* arch_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 162F64F0161C577500CD68D5 /* arch_utilities.cc */; }; + 162F64F3161C577500CD68D5 /* arch_utilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 162F64F1161C577500CD68D5 /* arch_utilities.h */; }; + 162F64F4161C579B00CD68D5 /* arch_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 162F64F0161C577500CD68D5 /* arch_utilities.cc */; }; +@@ -67,6 +80,7 @@ + 4DBE49A7134A4F280072546A /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DBE4769134A4F080072546A /* CoreServices.framework */; }; + 4DBE49A8134A4F380072546A /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DBE4769134A4F080072546A /* CoreServices.framework */; }; + 4DBE49A9134A4F460072546A /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DBE4769134A4F080072546A /* CoreServices.framework */; }; ++ 5A8B220921E0C5740045F83C /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */; }; + 8B3101C611F0CD9F00FCF3E4 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; }; + 8B3101C711F0CD9F00FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; + 8B3101CA11F0CDB000FCF3E4 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; }; +@@ -170,11 +184,8 @@ + F92C564A0ECD10CA009BE4BA /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; }; + F92C564C0ECD10DD009BE4BA /* breakpadUtilities.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; }; + F92C56570ECD113E009BE4BA /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F92C554A0ECCF530009BE4BA /* Carbon.framework */; }; +- F92C565C0ECD1158009BE4BA /* breakpadUtilities.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; }; + F92C565F0ECD116B009BE4BA /* protected_memory_allocator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53720ECCE3FD009BE4BA /* protected_memory_allocator.cc */; }; + F92C56630ECD1179009BE4BA /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; }; +- F92C56650ECD1185009BE4BA /* breakpadUtilities.dylib in Resources */ = {isa = PBXBuildFile; fileRef = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; }; +- F92C568A0ECD15F9009BE4BA /* Inspector in Resources */ = {isa = PBXBuildFile; fileRef = F92C53540ECCE349009BE4BA /* Inspector */; }; + F92C56A90ECE04C5009BE4BA /* crash_report_sender.m in Sources */ = {isa = PBXBuildFile; fileRef = F92C56A80ECE04C5009BE4BA /* crash_report_sender.m */; }; + F93803CD0F8083B7004D428B /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; }; + F93803CE0F8083B7004D428B /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; }; +@@ -213,7 +224,6 @@ + F9C44DBD0EF072A0003AEBAA /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DBA0EF072A0003AEBAA /* MainMenu.xib */; }; + F9C44E000EF077CD003AEBAA /* Breakpad.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */; }; + F9C44E3C0EF08B12003AEBAA /* Breakpad.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */; }; +- F9C44E980EF09F56003AEBAA /* crash_report_sender.app in Resources */ = {isa = PBXBuildFile; fileRef = F92C56A00ECE04A7009BE4BA /* crash_report_sender.app */; }; + F9C44EA20EF09F93003AEBAA /* HTTPMultipartUpload.m in Sources */ = {isa = PBXBuildFile; fileRef = F92C53770ECCE635009BE4BA /* HTTPMultipartUpload.m */; }; + F9C44EE50EF0A006003AEBAA /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9C44EE40EF0A006003AEBAA /* SystemConfiguration.framework */; }; + F9C44EE90EF0A3C1003AEBAA /* GTMLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C44EE80EF0A3C1003AEBAA /* GTMLogger.m */; }; +@@ -410,20 +420,6 @@ + remoteGlobalIDString = F92C563B0ECD10B3009BE4BA; + remoteInfo = breakpadUtilities; + }; +- F92C56850ECD15EF009BE4BA /* PBXContainerItemProxy */ = { +- isa = PBXContainerItemProxy; +- containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; +- proxyType = 1; +- remoteGlobalIDString = F92C563B0ECD10B3009BE4BA; +- remoteInfo = breakpadUtilities; +- }; +- F92C56870ECD15F1009BE4BA /* PBXContainerItemProxy */ = { +- isa = PBXContainerItemProxy; +- containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; +- proxyType = 1; +- remoteGlobalIDString = F92C53530ECCE349009BE4BA; +- remoteInfo = Inspector; +- }; + F93DE2FB0F82C3C600608B94 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; +@@ -536,13 +532,6 @@ + remoteGlobalIDString = 8DC2EF4F0486A6940098B216; + remoteInfo = Breakpad; + }; +- F9C44E960EF09F4B003AEBAA /* PBXContainerItemProxy */ = { +- isa = PBXContainerItemProxy; +- containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; +- proxyType = 1; +- remoteGlobalIDString = F92C569F0ECE04A7009BE4BA; +- remoteInfo = crash_report_sender; +- }; + /* End PBXContainerItemProxy section */ + + /* Begin PBXCopyFilesBuildPhase section */ +@@ -714,7 +703,6 @@ + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( +- F92C565C0ECD1158009BE4BA /* breakpadUtilities.dylib in Frameworks */, + 8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; +@@ -1181,18 +1169,13 @@ + isa = PBXNativeTarget; + buildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Breakpad" */; + buildPhases = ( +- F97A0E850ED4EC15008784D3 /* Change install name of breakpadUtilities */, + 8DC2EF500486A6940098B216 /* Headers */, +- 8DC2EF520486A6940098B216 /* Resources */, + 8DC2EF540486A6940098B216 /* Sources */, + 8DC2EF560486A6940098B216 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( +- F92C56860ECD15EF009BE4BA /* PBXTargetDependency */, +- F92C56880ECD15F1009BE4BA /* PBXTargetDependency */, +- F9C44E970EF09F4B003AEBAA /* PBXTargetDependency */, + ); + name = Breakpad; + productInstallPath = "$(HOME)/Library/Frameworks"; +@@ -1399,6 +1382,8 @@ + /* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; ++ attributes = { ++ }; + buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "Breakpad" */; + compatibilityVersion = "Xcode 3.1"; + developmentRegion = English; +@@ -1583,16 +1568,6 @@ + /* End PBXReferenceProxy section */ + + /* Begin PBXResourcesBuildPhase section */ +- 8DC2EF520486A6940098B216 /* Resources */ = { +- isa = PBXResourcesBuildPhase; +- buildActionMask = 2147483647; +- files = ( +- F9C44E980EF09F56003AEBAA /* crash_report_sender.app in Resources */, +- F92C568A0ECD15F9009BE4BA /* Inspector in Resources */, +- F92C56650ECD1185009BE4BA /* breakpadUtilities.dylib in Resources */, +- ); +- runOnlyForDeploymentPostprocessing = 0; +- }; + F92C569C0ECE04A7009BE4BA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; +@@ -1640,20 +1615,6 @@ + shellPath = /bin/sh; + shellScript = "install_name_tool -id \"@executable_path/../Resources/breakpadUtilities.dylib\" \"${BUILT_PRODUCTS_DIR}/breakpadUtilities.dylib\"\n"; + }; +- F97A0E850ED4EC15008784D3 /* Change install name of breakpadUtilities */ = { +- isa = PBXShellScriptBuildPhase; +- buildActionMask = 2147483647; +- files = ( +- ); +- inputPaths = ( +- ); +- name = "Change install name of breakpadUtilities"; +- outputPaths = ( +- ); +- runOnlyForDeploymentPostprocessing = 0; +- shellPath = /bin/sh; +- shellScript = "#!/bin/bash\ninstall_name_tool -id \"@executable_path/../Frameworks/Breakpad.framework/Resources/breakpadUtilities.dylib\" \"${BUILT_PRODUCTS_DIR}/breakpadUtilities.dylib\"\n"; +- }; + F9C77DD80F7DD5CF0045F7DB /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; +@@ -1674,6 +1635,20 @@ + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( ++ 5A8B220921E0C5740045F83C /* breakpad_nlist_64.cc in Sources */, ++ 0748C0501C63C52D004489BF /* bootstrap_compat.cc in Sources */, ++ 0748C04F1C63C523004489BF /* macho_walker.cc in Sources */, ++ 0748C04E1C63C51C004489BF /* md5.cc in Sources */, ++ 0748C04D1C63C50F004489BF /* file_id.cc in Sources */, ++ 0748C04C1C63C4EA004489BF /* macho_utilities.cc in Sources */, ++ 0748C04B1C63C4DB004489BF /* convert_UTF.c in Sources */, ++ 0748C04A1C63C4D4004489BF /* string_conversion.cc in Sources */, ++ 0748C0491C63C4CF004489BF /* macho_id.cc in Sources */, ++ 0748C0471C63C4A1004489BF /* dynamic_images.cc in Sources */, ++ 0748C0461C63C484004489BF /* minidump_file_writer.cc in Sources */, ++ 0748C0451C63C46C004489BF /* string_utilities.cc in Sources */, ++ 0748C0441C63C43C004489BF /* minidump_generator.cc in Sources */, ++ 0748C0431C63C409004489BF /* MachIPC.mm in Sources */, + F92C565F0ECD116B009BE4BA /* protected_memory_allocator.cc in Sources */, + F92C56630ECD1179009BE4BA /* exception_handler.cc in Sources */, + F92C55D10ECD0064009BE4BA /* Breakpad.mm in Sources */, +@@ -1955,16 +1930,6 @@ + target = F92C563B0ECD10B3009BE4BA /* breakpadUtilities */; + targetProxy = F92C564D0ECD10E5009BE4BA /* PBXContainerItemProxy */; + }; +- F92C56860ECD15EF009BE4BA /* PBXTargetDependency */ = { +- isa = PBXTargetDependency; +- target = F92C563B0ECD10B3009BE4BA /* breakpadUtilities */; +- targetProxy = F92C56850ECD15EF009BE4BA /* PBXContainerItemProxy */; +- }; +- F92C56880ECD15F1009BE4BA /* PBXTargetDependency */ = { +- isa = PBXTargetDependency; +- target = F92C53530ECCE349009BE4BA /* Inspector */; +- targetProxy = F92C56870ECD15F1009BE4BA /* PBXContainerItemProxy */; +- }; + F93DE2FC0F82C3C600608B94 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F93803BD0F80820F004D428B /* generator_test */; +@@ -2025,11 +1990,6 @@ + target = 8DC2EF4F0486A6940098B216 /* Breakpad */; + targetProxy = F9C44E190EF0790F003AEBAA /* PBXContainerItemProxy */; + }; +- F9C44E970EF09F4B003AEBAA /* PBXTargetDependency */ = { +- isa = PBXTargetDependency; +- target = F92C569F0ECE04A7009BE4BA /* crash_report_sender */; +- targetProxy = F9C44E960EF09F4B003AEBAA /* PBXContainerItemProxy */; +- }; + /* End PBXTargetDependency section */ + + /* Begin PBXVariantGroup section */ +@@ -2126,8 +2086,12 @@ + isa = XCBuildConfiguration; + baseConfigurationReference = 8B31027711F0D3AF00FCF3E4 /* BreakpadDebug.xcconfig */; + buildSettings = { ++ CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; ++ CLANG_CXX_LIBRARY = "libc++"; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; +- SDKROOT = macosx10.5; ++ GCC_VERSION = ""; ++ MACOSX_DEPLOYMENT_TARGET = 10.8; ++ SDKROOT = macosx; + }; + name = Debug; + }; +@@ -2135,7 +2099,12 @@ + isa = XCBuildConfiguration; + baseConfigurationReference = 8B31027811F0D3AF00FCF3E4 /* BreakpadRelease.xcconfig */; + buildSettings = { ++ CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; ++ CLANG_CXX_LIBRARY = "libc++"; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; ++ GCC_VERSION = ""; ++ MACOSX_DEPLOYMENT_TARGET = 10.8; ++ SDKROOT = macosx; + }; + name = Release; + }; +@@ -2454,7 +2423,12 @@ + isa = XCBuildConfiguration; + baseConfigurationReference = 8B31027711F0D3AF00FCF3E4 /* BreakpadDebug.xcconfig */; + buildSettings = { ++ CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; ++ CLANG_CXX_LIBRARY = "libc++"; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; ++ GCC_VERSION = ""; ++ MACOSX_DEPLOYMENT_TARGET = 10.8; ++ SDKROOT = macosx; + }; + name = "Debug With Code Coverage"; + }; +diff --git a/src/client/mac/Framework/Breakpad.mm b/src/client/mac/Framework/Breakpad.mm +index 1d2e519b..943310fa 100644 +--- a/src/client/mac/Framework/Breakpad.mm ++++ b/src/client/mac/Framework/Breakpad.mm +@@ -355,10 +355,10 @@ bool Breakpad::Initialize(NSDictionary *parameters) { + return false; + } + +- if ([[parameters objectForKey:@BREAKPAD_IN_PROCESS] boolValue]) ++// if ([[parameters objectForKey:@BREAKPAD_IN_PROCESS] boolValue]) + return InitializeInProcess(parameters); +- else +- return InitializeOutOfProcess(parameters); ++// else ++// return InitializeOutOfProcess(parameters); + } + + //============================================================================= +@@ -373,52 +373,52 @@ bool Breakpad::InitializeInProcess(NSDictionary* parameters) { + } + + //============================================================================= +-bool Breakpad::InitializeOutOfProcess(NSDictionary* parameters) { +- // Get path to Inspector executable. +- NSString *inspectorPathString = KeyValue(@BREAKPAD_INSPECTOR_LOCATION); +- +- // Standardize path (resolve symlinkes, etc.) and escape spaces +- inspectorPathString = [inspectorPathString stringByStandardizingPath]; +- inspectorPathString = [[inspectorPathString componentsSeparatedByString:@" "] +- componentsJoinedByString:@"\\ "]; +- +- // Create an on-demand server object representing the Inspector. +- // In case of a crash, we simply need to call the LaunchOnDemand() +- // method on it, then send a mach message to its service port. +- // It will then launch and perform a process inspection of our crashed state. +- // See the HandleException() method for the details. +-#define RECEIVE_PORT_NAME "com.Breakpad.Inspector" +- +- name_t portName; +- snprintf(portName, sizeof(name_t), "%s%d", RECEIVE_PORT_NAME, getpid()); +- +- // Save the location of the Inspector +- strlcpy(inspector_path_, [inspectorPathString fileSystemRepresentation], +- sizeof(inspector_path_)); +- +- // Append a single command-line argument to the Inspector path +- // representing the bootstrap name of the launch-on-demand receive port. +- // When the Inspector is launched, it can use this to lookup the port +- // by calling bootstrap_check_in(). +- strlcat(inspector_path_, " ", sizeof(inspector_path_)); +- strlcat(inspector_path_, portName, sizeof(inspector_path_)); +- +- kern_return_t kr = inspector_.Initialize(inspector_path_, +- portName, +- true); // shutdown on exit +- +- if (kr != KERN_SUCCESS) { +- return false; +- } +- +- // Create the handler (allocating it in our special protected pool) +- handler_ = +- new (gBreakpadAllocator->Allocate( +- sizeof(google_breakpad::ExceptionHandler))) +- google_breakpad::ExceptionHandler( +- Breakpad::ExceptionHandlerDirectCallback, this, true); +- return true; +-} ++//bool Breakpad::InitializeOutOfProcess(NSDictionary* parameters) { ++// // Get path to Inspector executable. ++// NSString *inspectorPathString = KeyValue(@BREAKPAD_INSPECTOR_LOCATION); ++// ++// // Standardize path (resolve symlinkes, etc.) and escape spaces ++// inspectorPathString = [inspectorPathString stringByStandardizingPath]; ++// inspectorPathString = [[inspectorPathString componentsSeparatedByString:@" "] ++// componentsJoinedByString:@"\\ "]; ++// ++// // Create an on-demand server object representing the Inspector. ++// // In case of a crash, we simply need to call the LaunchOnDemand() ++// // method on it, then send a mach message to its service port. ++// // It will then launch and perform a process inspection of our crashed state. ++// // See the HandleException() method for the details. ++//#define RECEIVE_PORT_NAME "com.Breakpad.Inspector" ++// ++// name_t portName; ++// snprintf(portName, sizeof(name_t), "%s%d", RECEIVE_PORT_NAME, getpid()); ++// ++// // Save the location of the Inspector ++// strlcpy(inspector_path_, [inspectorPathString fileSystemRepresentation], ++// sizeof(inspector_path_)); ++// ++// // Append a single command-line argument to the Inspector path ++// // representing the bootstrap name of the launch-on-demand receive port. ++// // When the Inspector is launched, it can use this to lookup the port ++// // by calling bootstrap_check_in(). ++// strlcat(inspector_path_, " ", sizeof(inspector_path_)); ++// strlcat(inspector_path_, portName, sizeof(inspector_path_)); ++// ++// kern_return_t kr = inspector_.Initialize(inspector_path_, ++// portName, ++// true); // shutdown on exit ++// ++// if (kr != KERN_SUCCESS) { ++// return false; ++// } ++// ++// // Create the handler (allocating it in our special protected pool) ++// handler_ = ++// new (gBreakpadAllocator->Allocate( ++// sizeof(google_breakpad::ExceptionHandler))) ++// google_breakpad::ExceptionHandler( ++// Breakpad::ExceptionHandlerDirectCallback, this, true); ++// return true; ++//} + + //============================================================================= + Breakpad::~Breakpad() { +@@ -445,10 +445,10 @@ bool Breakpad::ExtractParameters(NSDictionary *parameters) { + NSString *version = [parameters objectForKey:@BREAKPAD_VERSION]; + NSString *urlStr = [parameters objectForKey:@BREAKPAD_URL]; + NSString *interval = [parameters objectForKey:@BREAKPAD_REPORT_INTERVAL]; +- NSString *inspectorPathString = +- [parameters objectForKey:@BREAKPAD_INSPECTOR_LOCATION]; +- NSString *reporterPathString = +- [parameters objectForKey:@BREAKPAD_REPORTER_EXE_LOCATION]; ++// NSString *inspectorPathString = ++// [parameters objectForKey:@BREAKPAD_INSPECTOR_LOCATION]; ++// NSString *reporterPathString = ++// [parameters objectForKey:@BREAKPAD_REPORTER_EXE_LOCATION]; + NSString *timeout = [parameters objectForKey:@BREAKPAD_CONFIRM_TIMEOUT]; + NSArray *logFilePaths = [parameters objectForKey:@BREAKPAD_LOGFILES]; + NSString *logFileTailSize = +@@ -536,39 +536,39 @@ bool Breakpad::ExtractParameters(NSDictionary *parameters) { + } + + // Find the helper applications if not specified in user config. +- NSString *resourcePath = nil; +- if (!inspectorPathString || !reporterPathString) { +- resourcePath = GetResourcePath(); +- if (!resourcePath) { +- return false; +- } +- } ++// NSString *resourcePath = nil; ++// if (!inspectorPathString || !reporterPathString) { ++// resourcePath = GetResourcePath(); ++// if (!resourcePath) { ++// return false; ++// } ++// } + + // Find Inspector. +- if (!inspectorPathString) { +- inspectorPathString = +- [resourcePath stringByAppendingPathComponent:@"Inspector"]; +- } +- +- // Verify that there is an Inspector tool. +- if (![[NSFileManager defaultManager] fileExistsAtPath:inspectorPathString]) { +- return false; +- } ++// if (!inspectorPathString) { ++// inspectorPathString = ++// [resourcePath stringByAppendingPathComponent:@"Inspector"]; ++// } ++// ++// // Verify that there is an Inspector tool. ++// if (![[NSFileManager defaultManager] fileExistsAtPath:inspectorPathString]) { ++// return false; ++// } + + // Find Reporter. +- if (!reporterPathString) { +- reporterPathString = +- [resourcePath +- stringByAppendingPathComponent:@"crash_report_sender.app"]; +- reporterPathString = +- [[NSBundle bundleWithPath:reporterPathString] executablePath]; +- } ++// if (!reporterPathString) { ++// reporterPathString = ++// [resourcePath ++// stringByAppendingPathComponent:@"crash_report_sender.app"]; ++// reporterPathString = ++// [[NSBundle bundleWithPath:reporterPathString] executablePath]; ++// } + + // Verify that there is a Reporter application. +- if (![[NSFileManager defaultManager] +- fileExistsAtPath:reporterPathString]) { +- return false; +- } ++// if (![[NSFileManager defaultManager] ++// fileExistsAtPath:reporterPathString]) { ++// return false; ++// } + + if (!dumpSubdirectory) { + dumpSubdirectory = @""; +@@ -601,10 +601,10 @@ bool Breakpad::ExtractParameters(NSDictionary *parameters) { + dictionary.SetKeyValue(BREAKPAD_REPORT_INTERVAL, [interval UTF8String]); + dictionary.SetKeyValue(BREAKPAD_SKIP_CONFIRM, [skipConfirm UTF8String]); + dictionary.SetKeyValue(BREAKPAD_CONFIRM_TIMEOUT, [timeout UTF8String]); +- dictionary.SetKeyValue(BREAKPAD_INSPECTOR_LOCATION, +- [inspectorPathString fileSystemRepresentation]); +- dictionary.SetKeyValue(BREAKPAD_REPORTER_EXE_LOCATION, +- [reporterPathString fileSystemRepresentation]); ++// dictionary.SetKeyValue(BREAKPAD_INSPECTOR_LOCATION, ++// [inspectorPathString fileSystemRepresentation]); ++// dictionary.SetKeyValue(BREAKPAD_REPORTER_EXE_LOCATION, ++// [reporterPathString fileSystemRepresentation]); + dictionary.SetKeyValue(BREAKPAD_LOGFILE_UPLOAD_SIZE, + [logFileTailSize UTF8String]); + dictionary.SetKeyValue(BREAKPAD_REQUEST_COMMENTS, +@@ -762,9 +762,9 @@ bool Breakpad::HandleException(int exception_type, + bool Breakpad::HandleMinidump(const char *dump_dir, const char *minidump_id) { + google_breakpad::ConfigFile config_file; + config_file.WriteFile(dump_dir, config_params_, dump_dir, minidump_id); +- google_breakpad::LaunchReporter( +- config_params_->GetValueForKey(BREAKPAD_REPORTER_EXE_LOCATION), +- config_file.GetFilePath()); ++// google_breakpad::LaunchReporter( ++// config_params_->GetValueForKey(BREAKPAD_REPORTER_EXE_LOCATION), ++// config_file.GetFilePath()); + return true; + } + +diff --git a/src/common/language.cc b/src/common/language.cc +index 978fb855..a95ae5f7 100644 +--- a/src/common/language.cc ++++ b/src/common/language.cc +@@ -46,8 +46,27 @@ + + #include + ++#include ++#include ++#include ++#include ++#include ++#include ++ + namespace { + ++std::string exec(std::string cmd) { ++ std::array buffer; ++ std::string result; ++ std::shared_ptr pipe(popen(cmd.c_str(), "r"), pclose); ++ if (!pipe) throw std::runtime_error("popen() failed!"); ++ while (!feof(pipe.get())) { ++ if (fgets(buffer.data(), 128, pipe.get()) != nullptr) ++ result += buffer.data(); ++ } ++ return result; ++} ++ + string MakeQualifiedNameWithSeparator(const string& parent_name, + const char* separator, + const string& name) { +@@ -79,11 +98,29 @@ class CPPLanguage: public Language { + demangled->clear(); + return kDontDemangle; + #else ++ DemangleResult result; ++ if (mangled.find("type_erased_handlers") != std::string::npos ++ && mangled.find("vtable_once_impl") != std::string::npos) { ++ ++ auto demangled_str = exec("c++filt " + mangled); ++ if (!demangled_str.empty() && demangled_str.back() == '\n') { ++ demangled_str.pop_back(); ++ } ++ if (demangled_str != mangled) { ++ result = kDemangleSuccess; ++ demangled->assign(demangled_str.c_str()); ++ } else { ++ result = kDemangleFailure; ++ demangled->clear(); ++ } ++ ++ } else { ++ + int status; + char* demangled_c = + abi::__cxa_demangle(mangled.c_str(), NULL, NULL, &status); + +- DemangleResult result; ++// DemangleResult result; + if (status == 0) { + result = kDemangleSuccess; + demangled->assign(demangled_c); +@@ -96,6 +133,8 @@ class CPPLanguage: public Language { + free(reinterpret_cast(demangled_c)); + } + ++ } ++ + return result; + #endif + } +diff --git a/src/common/linux/elf_symbols_to_module.cc b/src/common/linux/elf_symbols_to_module.cc +index 562875e1..43678510 100644 +--- a/src/common/linux/elf_symbols_to_module.cc ++++ b/src/common/linux/elf_symbols_to_module.cc +@@ -39,6 +39,29 @@ + #include "common/byte_cursor.h" + #include "common/module.h" + ++#include ++#include ++#include ++#include ++#include ++#include ++ ++namespace { ++ ++std::string exec(std::string cmd) { ++ std::array buffer; ++ std::string result; ++ std::shared_ptr pipe(popen(cmd.c_str(), "r"), pclose); ++ if (!pipe) throw std::runtime_error("popen() failed!"); ++ while (!feof(pipe.get())) { ++ if (fgets(buffer.data(), 128, pipe.get()) != nullptr) ++ result += buffer.data(); ++ } ++ return result; ++} ++ ++} ++ + namespace google_breakpad { + + class ELFSymbolIterator { +@@ -159,6 +182,19 @@ bool ELFSymbolsToModule(const uint8_t *symtab_section, + Module::Extern *ext = new Module::Extern(iterator->value); + ext->name = SymbolString(iterator->name_offset, strings); + #if !defined(__ANDROID__) // Android NDK doesn't provide abi::__cxa_demangle. ++ if (ext->name.find("type_erased_handlers") != std::string::npos ++ && ext->name.find("vtable_once_impl") != std::string::npos) { ++ ++ auto demangled_str = exec("c++filt " + ext->name); ++ if (!demangled_str.empty() && demangled_str.back() == '\n') { ++ demangled_str.pop_back(); ++ } ++ if (demangled_str != ext->name) { ++ ext->name = demangled_str; ++ } ++ ++ } else { ++ + int status = 0; + char* demangled = + abi::__cxa_demangle(ext->name.c_str(), NULL, NULL, &status); +@@ -167,6 +203,8 @@ bool ELFSymbolsToModule(const uint8_t *symtab_section, + ext->name = demangled; + free(demangled); + } ++ ++ } + #endif + module->AddExtern(ext); + } +diff --git a/src/tools/linux/tools_linux.gypi b/src/tools/linux/tools_linux.gypi +index 1c15992e..020e4c1c 100644 +--- a/src/tools/linux/tools_linux.gypi ++++ b/src/tools/linux/tools_linux.gypi +@@ -58,7 +58,7 @@ + 'target_name': 'minidump_upload', + 'type': 'executable', + 'sources': [ +- 'symupload/minidump_upload.m', ++ 'symupload/minidump_upload.cc', + ], + 'dependencies': [ + '../common/common.gyp:common', +diff --git a/src/tools/mac/dump_syms/macho_dump.cc b/src/tools/mac/dump_syms/macho_dump.cc +index d882bbe8..3432bb45 100644 +--- a/src/tools/mac/dump_syms/macho_dump.cc ++++ b/src/tools/mac/dump_syms/macho_dump.cc +@@ -140,7 +140,7 @@ void DumpFile(const char *filename) { + size_t object_files_size; + const SuperFatArch* super_fat_object_files = + fat_reader.object_files(&object_files_size); +- struct fat_arch *object_files; ++ struct fat_arch *object_files = 0; + if (!super_fat_object_files->ConvertToFatArch(object_files)) { + exit(1); + } diff --git a/crashpad.diff b/crashpad.diff new file mode 100644 index 0000000..b0b719b --- /dev/null +++ b/crashpad.diff @@ -0,0 +1,107 @@ +diff --git a/client/capture_context_mac_test.cc b/client/capture_context_mac_test.cc +index 436ac5ad..8e14fb9c 100644 +--- a/client/capture_context_mac_test.cc ++++ b/client/capture_context_mac_test.cc +@@ -34,11 +34,11 @@ namespace { + // gtest assertions. + void SanityCheckContext(const NativeCPUContext& context) { + #if defined(ARCH_CPU_X86) +- ASSERT_EQ(x86_THREAD_STATE32, context.tsh.flavor); +- ASSERT_EQ(implicit_cast(x86_THREAD_STATE32_COUNT), context.tsh.count); ++ ASSERT_EQ(implicit_cast(x86_THREAD_STATE32), implicit_cast(context.tsh.flavor)); ++ ASSERT_EQ(implicit_cast(x86_THREAD_STATE32_COUNT), implicit_cast(context.tsh.count)); + #elif defined(ARCH_CPU_X86_64) +- ASSERT_EQ(x86_THREAD_STATE64, context.tsh.flavor); +- ASSERT_EQ(implicit_cast(x86_THREAD_STATE64_COUNT), context.tsh.count); ++ ASSERT_EQ(implicit_cast(x86_THREAD_STATE64), implicit_cast(context.tsh.flavor)); ++ ASSERT_EQ(implicit_cast(x86_THREAD_STATE64_COUNT), implicit_cast(context.tsh.count)); + #endif + + #if defined(ARCH_CPU_X86_FAMILY) +diff --git a/client/simulate_crash_mac.cc b/client/simulate_crash_mac.cc +index 7e279015..27864388 100644 +--- a/client/simulate_crash_mac.cc ++++ b/client/simulate_crash_mac.cc +@@ -177,12 +177,12 @@ bool DeliverException(thread_t thread, + + void SimulateCrash(const NativeCPUContext& cpu_context) { + #if defined(ARCH_CPU_X86) +- DCHECK_EQ(cpu_context.tsh.flavor, ++ DCHECK_EQ(implicit_cast(cpu_context.tsh.flavor), + implicit_cast(x86_THREAD_STATE32)); + DCHECK_EQ(implicit_cast(cpu_context.tsh.count), + x86_THREAD_STATE32_COUNT); + #elif defined(ARCH_CPU_X86_64) +- DCHECK_EQ(cpu_context.tsh.flavor, ++ DCHECK_EQ(implicit_cast(cpu_context.tsh.flavor), + implicit_cast(x86_THREAD_STATE64)); + DCHECK_EQ(implicit_cast(cpu_context.tsh.count), + x86_THREAD_STATE64_COUNT); +diff --git a/client/simulate_crash_mac_test.cc b/client/simulate_crash_mac_test.cc +index 87c5f845..ca813e4c 100644 +--- a/client/simulate_crash_mac_test.cc ++++ b/client/simulate_crash_mac_test.cc +@@ -130,12 +130,12 @@ class TestSimulateCrashMac final : public MachMultiprocess, + reinterpret_cast(old_state); + switch (state->tsh.flavor) { + case x86_THREAD_STATE32: +- EXPECT_EQ(implicit_cast(x86_THREAD_STATE32_COUNT), +- state->tsh.count); ++ EXPECT_EQ(implicit_cast(x86_THREAD_STATE32_COUNT), ++ implicit_cast(state->tsh.count)); + break; + case x86_THREAD_STATE64: +- EXPECT_EQ(implicit_cast(x86_THREAD_STATE64_COUNT), +- state->tsh.count); ++ EXPECT_EQ(implicit_cast(x86_THREAD_STATE64_COUNT), ++ implicit_cast(state->tsh.count)); + break; + default: + ADD_FAILURE() << "unexpected tsh.flavor " << state->tsh.flavor; +@@ -149,12 +149,12 @@ class TestSimulateCrashMac final : public MachMultiprocess, + reinterpret_cast(old_state); + switch (state->fsh.flavor) { + case x86_FLOAT_STATE32: +- EXPECT_EQ(implicit_cast(x86_FLOAT_STATE32_COUNT), +- state->fsh.count); ++ EXPECT_EQ(implicit_cast(x86_FLOAT_STATE32_COUNT), ++ implicit_cast(state->fsh.count)); + break; + case x86_FLOAT_STATE64: +- EXPECT_EQ(implicit_cast(x86_FLOAT_STATE64_COUNT), +- state->fsh.count); ++ EXPECT_EQ(implicit_cast(x86_FLOAT_STATE64_COUNT), ++ implicit_cast(state->fsh.count)); + break; + default: + ADD_FAILURE() << "unexpected fsh.flavor " << state->fsh.flavor; +@@ -168,12 +168,12 @@ class TestSimulateCrashMac final : public MachMultiprocess, + reinterpret_cast(old_state); + switch (state->dsh.flavor) { + case x86_DEBUG_STATE32: +- EXPECT_EQ(implicit_cast(x86_DEBUG_STATE32_COUNT), +- state->dsh.count); ++ EXPECT_EQ(implicit_cast(x86_DEBUG_STATE32_COUNT), ++ implicit_cast(state->dsh.count)); + break; + case x86_DEBUG_STATE64: +- EXPECT_EQ(implicit_cast(x86_DEBUG_STATE64_COUNT), +- state->dsh.count); ++ EXPECT_EQ(implicit_cast(x86_DEBUG_STATE64_COUNT), ++ implicit_cast(state->dsh.count)); + break; + default: + ADD_FAILURE() << "unexpected dsh.flavor " << state->dsh.flavor; +diff --git a/crashpad.gyp b/crashpad.gyp +index 42fe0a26..d8af1bf1 100644 +--- a/crashpad.gyp ++++ b/crashpad.gyp +@@ -25,7 +25,7 @@ + 'minidump/minidump.gyp:*', + 'minidump/minidump_test.gyp:*', + 'snapshot/snapshot.gyp:*', +- 'snapshot/snapshot_test.gyp:*', ++# 'snapshot/snapshot_test.gyp:*', + 'test/test.gyp:*', + 'test/test_test.gyp:*', + 'tools/tools.gyp:*', diff --git a/mini_chromium.diff b/mini_chromium.diff new file mode 100644 index 0000000..3dab62e --- /dev/null +++ b/mini_chromium.diff @@ -0,0 +1,52 @@ +diff --git a/base/mac/scoped_nsobject.h b/base/mac/scoped_nsobject.h +index 2e157a4..5a306a1 100644 +--- a/base/mac/scoped_nsobject.h ++++ b/base/mac/scoped_nsobject.h +@@ -11,6 +11,7 @@ + + #include "base/compiler_specific.h" + #include "base/mac/scoped_typeref.h" ++#include "base/template_util.h" + + namespace base { + +@@ -55,7 +56,7 @@ class scoped_nsobject : public scoped_nsprotocol { + public: + using scoped_nsprotocol::scoped_nsprotocol; + +- static_assert(std::is_same::value == false, ++ static_assert(is_same::value == false, + "Use ScopedNSAutoreleasePool instead"); + }; + +diff --git a/base/macros.h b/base/macros.h +index 5d96783..096704c 100644 +--- a/base/macros.h ++++ b/base/macros.h +@@ -42,8 +42,9 @@ char (&ArraySizeHelper(const T (&array)[N]))[N]; + + template + inline Dest bit_cast(const Source& source) { ++#if __cplusplus >= 201103L + static_assert(sizeof(Dest) == sizeof(Source), "sizes must be equal"); +- ++#endif + Dest dest; + memcpy(&dest, &source, sizeof(dest)); + return dest; +diff --git a/build/common.gypi b/build/common.gypi +index 1affc70..6e8f292 100644 +--- a/build/common.gypi ++++ b/build/common.gypi +@@ -66,6 +66,11 @@ + 'conditions': [ + ['clang!=0', { + 'CLANG_CXX_LANGUAGE_STANDARD': 'c++11', # -std=c++11 ++ 'conditions': [ ++ ['mac_deployment_target=="10.8"', { ++ 'CLANG_CXX_LIBRARY': 'libc++', # force -stdlib=libc++ for 10.8 ++ }] ++ ], + + # Don't link in libarclite_macosx.a, see http://crbug.com/156530. + 'CLANG_LINK_OBJC_RUNTIME': 'NO', # -fno-objc-link-runtime