diff options
Diffstat (limited to 'src/client/mac/crash_generation/Inspector.mm')
-rw-r--r-- | src/client/mac/crash_generation/Inspector.mm | 180 |
1 files changed, 2 insertions, 178 deletions
diff --git a/src/client/mac/crash_generation/Inspector.mm b/src/client/mac/crash_generation/Inspector.mm index 24dc7940..2a2c08db 100644 --- a/src/client/mac/crash_generation/Inspector.mm +++ b/src/client/mac/crash_generation/Inspector.mm @@ -35,7 +35,6 @@ #include <stdio.h> #include <string.h> #include <string> -#include <sys/time.h> #import "client/mac/crash_generation/Inspector.h" @@ -49,160 +48,9 @@ #import <Foundation/Foundation.h> -#if VERBOSE - bool gDebugLog = true; -#else - bool gDebugLog = false; -#endif - namespace google_breakpad { //============================================================================= -BOOL EnsureDirectoryPathExists(NSString *dirPath) { - NSFileManager *mgr = [NSFileManager defaultManager]; - - // If we got a relative path, prepend the current directory - if (![dirPath isAbsolutePath]) - dirPath = [[mgr currentDirectoryPath] stringByAppendingPathComponent:dirPath]; - - NSString *path = dirPath; - - // Ensure that no file exists within the path which would block creation - while (1) { - BOOL isDir; - if ([mgr fileExistsAtPath:path isDirectory:&isDir]) { - if (isDir) - break; - - return NO; - } - - path = [path stringByDeletingLastPathComponent]; - } - - // Path now contains the first valid directory (or is empty) - if (![path length]) - return NO; - - NSString *common = - [dirPath commonPrefixWithString:path options:NSLiteralSearch]; - - // If everything is good - if ([common isEqualToString:dirPath]) - return YES; - - // Break up the difference into components - NSString *diff = [dirPath substringFromIndex:[common length] + 1]; - NSArray *components = [diff pathComponents]; - NSUInteger count = [components count]; - - // Rebuild the path one component at a time - NSDictionary *attrs = - [NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedLong:0750] - forKey:NSFilePosixPermissions]; - path = common; - for (NSUInteger i = 0; i < count; ++i) { - path = [path stringByAppendingPathComponent:[components objectAtIndex:i]]; - - if (![mgr createDirectoryAtPath:path attributes:attrs]) - return NO; - } - - return YES; -} - -//============================================================================= -BOOL ConfigFile::WriteData(const void *data, size_t length) { - size_t result = write(config_file_, data, length); - - return result == length; -} - -//============================================================================= -BOOL ConfigFile::AppendConfigData(const char *key, - const void *data, size_t length) { - assert(config_file_ != -1); - - if (!key) { - DEBUGLOG(stderr, "Breakpad: Missing Key\n"); - return NO; - } - - if (!data) { - DEBUGLOG(stderr, "Breakpad: Missing data for key: %s\n", key ? key : - "<Unknown Key>"); - return NO; - } - - // Write the key, \n, length of data (ascii integer), \n, data - char buffer[16]; - char nl = '\n'; - BOOL result = WriteData(key, strlen(key)); - - snprintf(buffer, sizeof(buffer) - 1, "\n%lu\n", length); - result &= WriteData(buffer, strlen(buffer)); - result &= WriteData(data, length); - result &= WriteData(&nl, 1); - return result; -} - -//============================================================================= -BOOL ConfigFile::AppendConfigString(const char *key, - const char *value) { - return AppendConfigData(key, value, strlen(value)); -} - -//============================================================================= -void ConfigFile::WriteFile(const SimpleStringDictionary *configurationParameters, - const char *dump_dir, - const char *minidump_id) { - - assert(config_file_ == -1); - - // Open and write out configuration file preamble - strlcpy(config_file_path_, "/tmp/Config-XXXXXX", - sizeof(config_file_path_)); - config_file_ = mkstemp(config_file_path_); - - if (config_file_ == -1) { - DEBUGLOG(stderr, - "mkstemp(config_file_path_) == -1 (%s)\n", - strerror(errno)); - return; - } - else { - DEBUGLOG(stderr, "Writing config file to (%s)\n", config_file_path_); - } - - has_created_file_ = true; - - // Add the minidump dir - AppendConfigString(kReporterMinidumpDirectoryKey, dump_dir); - AppendConfigString(kReporterMinidumpIDKey, minidump_id); - - // Write out the configuration parameters - BOOL result = YES; - const SimpleStringDictionary &dictionary = *configurationParameters; - - const KeyValueEntry *entry = NULL; - SimpleStringDictionaryIterator iter(dictionary); - - while ((entry = iter.Next())) { - DEBUGLOG(stderr, - "config: (%s) -> (%s)\n", - entry->GetKey(), - entry->GetValue()); - result = AppendConfigString(entry->GetKey(), entry->GetValue()); - - if (!result) - break; - } - - close(config_file_); - config_file_ = -1; -} - -//============================================================================= void Inspector::Inspect(const char *receive_port_name) { kern_return_t result = ResetBootstrapPort(); if (result != KERN_SUCCESS) { @@ -414,30 +262,6 @@ kern_return_t Inspector::ReadMessages() { } //============================================================================= -// Sets keys in the parameters dictionary that are specific to process uptime. -// The two we set are process up time, and process crash time. -void Inspector::SetCrashTimeParameters() { - // Set process uptime parameter - struct timeval tv; - gettimeofday(&tv, NULL); - - char processUptimeString[32], processCrashtimeString[32]; - const char *processStartTimeString = - config_params_.GetValueForKey(BREAKPAD_PROCESS_START_TIME); - - // Set up time if we've received the start time. - if (processStartTimeString) { - time_t processStartTime = strtol(processStartTimeString, NULL, 10); - time_t processUptime = tv.tv_sec - processStartTime; - sprintf(processUptimeString, "%zd", processUptime); - config_params_.SetKeyValue(BREAKPAD_PROCESS_UP_TIME, processUptimeString); - } - - sprintf(processCrashtimeString, "%zd", tv.tv_sec); - config_params_.SetKeyValue(BREAKPAD_PROCESS_CRASH_TIME, - processCrashtimeString); -} - bool Inspector::InspectTask() { // keep the task quiet while we're looking at it task_suspend(remote_task_); @@ -448,7 +272,6 @@ bool Inspector::InspectTask() { const char *minidumpDirectory = config_params_.GetValueForKey(BREAKPAD_DUMP_DIRECTORY); - SetCrashTimeParameters(); // If the client app has not specified a minidump directory, // use a default of Library/<kDefaultLibrarySubdirectory>/<Product Name> if (!minidumpDirectory || 0 == strlen(minidumpDirectory)) { @@ -499,7 +322,8 @@ bool Inspector::InspectTask() { [minidumpPath UTF8String]); - config_file_.WriteFile( &config_params_, + config_file_.WriteFile( 0, + &config_params_, minidumpLocation.GetPath(), minidumpLocation.GetID()); |