Add logging to file for GPBS to debug associated gpbs crashes

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/back/branches/gnustep_testplant_branch@39204 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Marcian Lytwyn 2015-12-01 17:06:52 +00:00
parent bc7143d2d5
commit c996515520

View file

@ -736,27 +736,27 @@ NSMutableDictionary *pasteboards = nil;
} }
- (int) declareTypes: (bycopy NSArray*)types - (int) declareTypes: (bycopy NSArray*)types
owner: (id)owner owner: (id)owner
pasteboard: (NSPasteboard*)pb pasteboard: (NSPasteboard*)pb
{ {
PasteboardEntry *old = RETAIN(current); PasteboardEntry *old = RETAIN(current);
id x = [xPbClass ownerByOsPb: name]; id x = [xPbClass ownerByOsPb: name];
if ([owner isProxy] == YES) if ([owner isProxy] == YES)
{ {
Protocol *p = @protocol(GSPasteboardCallback); Protocol *p = @protocol(GSPasteboardCallback);
NSConnection *c = [owner connectionForProxy]; NSConnection *c = [owner connectionForProxy];
[owner setProtocolForProxy: p]; [owner setProtocolForProxy: p];
/* If this is on a connection we don't know about, add it to our /* If this is on a connection we don't know about, add it to our
* list of pasteboard connections so that we can track its removal * list of pasteboard connections so that we can track its removal
* in order to auto_stop if necessary. * in order to auto_stop if necessary.
*/ */
if ([connections indexOfObjectIdenticalTo: c] == NSNotFound) if ([connections indexOfObjectIdenticalTo: c] == NSNotFound)
{ {
[connections addObject: c]; [connections addObject: c];
} }
} }
/* /*
* If neither the new nor the old owner of the pasteboard is the X * If neither the new nor the old owner of the pasteboard is the X
@ -767,11 +767,11 @@ NSMutableDictionary *pasteboards = nil;
x = nil; x = nil;
else if (x == [old owner]) else if (x == [old owner])
x = nil; x = nil;
current = [PasteboardEntry newWithTypes: types current = [PasteboardEntry newWithTypes: types
owner: owner owner: owner
pboard: pb pboard: pb
ref: nextCount++]; ref: nextCount++];
[history addObject: current]; [history addObject: current];
RELEASE(current); RELEASE(current);
if ([history count] > histLength) if ([history count] > histLength)
@ -789,7 +789,7 @@ NSMutableDictionary *pasteboards = nil;
if (verbose) if (verbose)
{ {
NSLog(@"%@ declare types '%@' version %d on %@ for %@", NSLog(@"%@ declare types '%@' version %d on %@ for %@",
self, types, [current refNum], pb, owner); self, types, [current refNum], pb, owner);
} }
return [current refNum]; return [current refNum];
} }
@ -961,14 +961,12 @@ NSMutableDictionary *pasteboards = nil;
@implementation PasteboardServer @implementation PasteboardServer
- (BOOL) connection: (NSConnection*)ancestor - (BOOL) connection: (NSConnection*)ancestor shouldMakeNewConnection: (NSConnection*)newConn;
shouldMakeNewConnection: (NSConnection*)newConn;
{ {
[[NSNotificationCenter defaultCenter] [[NSNotificationCenter defaultCenter] addObserver: self
addObserver: self selector: @selector(connectionBecameInvalid:)
selector: @selector(connectionBecameInvalid:) name: NSConnectionDidDieNotification
name: NSConnectionDidDieNotification object: newConn];
object: newConn];
[newConn setDelegate: self]; [newConn setDelegate: self];
return YES; return YES;
} }
@ -988,9 +986,9 @@ NSMutableDictionary *pasteboards = nil;
PasteboardObject *o; PasteboardObject *o;
while ((o = [e nextObject]) != nil) while ((o = [e nextObject]) != nil)
{ {
[o checkConnection: connection]; [o checkConnection: connection];
} }
} }
[connections removeObjectIdenticalTo: connection]; [connections removeObjectIdenticalTo: connection];
if (auto_stop == YES && [connections count] == 0) if (auto_stop == YES && [connections count] == 0)
@ -1044,7 +1042,7 @@ NSMutableDictionary *pasteboards = nil;
+initializePasteboard will already have printed a warning in this case. +initializePasteboard will already have printed a warning in this case.
*/ */
if (xPbClass && ![xPbClass initializePasteboard]) if (xPbClass && ![xPbClass initializePasteboard])
xPbClass = nil; xPbClass = nil;
} }
return self; return self;
} }
@ -1149,9 +1147,9 @@ init(int argc, char** argv, char **env)
shouldFork = NO; shouldFork = NO;
} }
else if ([a isEqualToString: @"--verbose"] == YES) else if ([a isEqualToString: @"--verbose"] == YES)
{ {
verbose++; verbose++;
} }
else if ([a hasPrefix: @"-"] == YES) else if ([a hasPrefix: @"-"] == YES)
{ {
count++; // Skip user default specification count++; // Skip user default specification
@ -1165,6 +1163,14 @@ init(int argc, char** argv, char **env)
} }
} }
// Override verbosity if defaults key set...
NSNumber *verboseLevel = [[NSUserDefaults standardUserDefaults] objectForKey:@"GSGPBSLoggingVerboseLevel"];
if (verboseLevel)
{
verbose = [verboseLevel integerValue];
NSLog(@"%s:overriding verbose level to %ld", __PRETTY_FUNCTION__, (long)verbose);
}
for (count = 0; count < NSIG; count++) for (count = 0; count < NSIG; count++)
{ {
if (count == SIGABRT) continue; if (count == SIGABRT) continue;
@ -1195,16 +1201,124 @@ init(int argc, char** argv, char **env)
t = [NSTask new]; t = [NSTask new];
NS_DURING NS_DURING
{ {
NSFileHandle *outHandle = [NSFileHandle fileHandleWithNullDevice];
NSFileHandle *errHandle = [NSFileHandle fileHandleWithNullDevice];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[args removeObjectAtIndex: 0]; [args removeObjectAtIndex: 0];
[args addObject: @"--daemon"]; [args addObject: @"--daemon"];
[t setLaunchPath: [[NSBundle mainBundle] executablePath]]; [t setLaunchPath: [[NSBundle mainBundle] executablePath]];
[t setArguments: args]; [t setArguments: args];
[t setEnvironment: [pInfo environment]]; [t setEnvironment: [pInfo environment]];
null = [NSFileHandle fileHandleWithNullDevice]; null = [NSFileHandle fileHandleWithNullDevice];
[t setStandardInput: null];
[t setStandardOutput: null]; // Default to stdin...
[t setStandardError: null]; [t setStandardInput: null];
// Check whether we should configure for a log file for
// stdout/stderr...
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"GSGPBSLoggingEnabled"])
{
NSFileManager *filemgr = [NSFileManager defaultManager];
NSArray *folderPaths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
NSString *filepath = [[folderPaths firstObject] stringByAppendingPathComponent:@"GNUstep"];
BOOL isDir = NO;
NSError *error = nil;
NSLog(@"%s:log path: %@", __PRETTY_FUNCTION__, filepath);
// Create directory if it does not exists...
if ([filemgr fileExistsAtPath:filepath isDirectory:&isDir] == NO)
{
if ([filemgr createDirectoryAtPath:filepath withIntermediateDirectories:YES attributes:nil error:&error] == NO)
{
NSLog(@"%s:error creating path: %@ error: %@", __PRETTY_FUNCTION__, error);
}
}
// Purge logfile to 3 max each...
NSArray *properties = [NSArray arrayWithObjects:@"NSURLCreationDateKey", nil];
NSArray *logfiles = [filemgr contentsOfDirectoryAtURL:[NSURL fileURLWithPath:filepath]
includingPropertiesForKeys:properties
options:0
error:&error];
if (error)
{
NSLog(@"%s:directory contents load error: %@", __PRETTY_FUNCTION__, error);
}
else
{
NSPredicate *predicateErr = [NSPredicate predicateWithFormat:@"path contains[c] 'err.log'"];
NSPredicate *predicateOut = [NSPredicate predicateWithFormat:@"path contains[c] 'out.log'"];
NSArray *errfiles = [logfiles filteredArrayUsingPredicate:predicateErr];
NSArray *outfiles = [logfiles filteredArrayUsingPredicate:predicateOut];
// Purge standard error log files...
if (errfiles && ([errfiles count] > 1))
{
NSLog(@"%s:purging error log files: %@", __PRETTY_FUNCTION__, errfiles);
}
// Purge standard out log files...
if (outfiles && ([outfiles count] > 1))
{
NSLog(@"%s:purging output log files: %@", __PRETTY_FUNCTION__, outfiles);
}
}
if ([filemgr fileExistsAtPath:filepath isDirectory:&isDir] && isDir)
{
NSString *filename = [defaults objectForKey:@"GSGPBSLoggingFilename"];
// Default filename if user default is not set...
if (filename == nil)
{
filename = @"gpbs";
}
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"GSGPBSLoggingAttachPid"] == NO)
filename = [filename stringByAppendingFormat:@"_%ld",getpid()];
NSString *outfile = [filename stringByAppendingFormat:@"_out.log"];
NSString *outpath = [filepath stringByAppendingPathComponent:outfile];
NSString *errfile = [filename stringByAppendingFormat:@"_err.log"];
NSString *errpath = [filepath stringByAppendingPathComponent:errfile];
if ([filemgr fileExistsAtPath:outpath] == NO)
if ([filemgr createFileAtPath:outpath contents:nil attributes:nil] == NO)
NSLog(@"%s:error creating file at path: %@", __PRETTY_FUNCTION__, outpath);
if ([filemgr fileExistsAtPath:errpath] == NO)
if ([filemgr createFileAtPath:errpath contents:nil attributes:nil] == NO)
NSLog(@"%s:error creating file at path: %@", __PRETTY_FUNCTION__, errpath);
// Create the file handles...
if (([filemgr fileExistsAtPath:outpath]) &&
([filemgr fileExistsAtPath:errpath]))
{
outHandle = [NSFileHandle fileHandleForWritingAtPath:[filepath stringByAppendingPathComponent:outfile]];
errHandle = [NSFileHandle fileHandleForWritingAtPath:[filepath stringByAppendingPathComponent:errfile]];
// Create a message with initial start date/time...
NSDate *date = [NSDate date];
NSString *dateString = [date descriptionWithCalendarFormat:nil timeZone:nil locale:nil];
NSString *message = [NSString stringWithFormat:@"GPBS Startup at %@\n", dateString];
NSData *msgdata = [NSData dataWithBytes:[message cStringUsingEncoding:NSUTF8StringEncoding] length:[message length]];
// Write the initial message into the file...
[outHandle writeData:msgdata];
[errHandle writeData:msgdata];
}
}
}
// Set standard output/error...
[t setStandardOutput: outHandle];
[t setStandardError: errHandle];
// Launch...
[t launch]; [t launch];
// and release our hold...
DESTROY(t); DESTROY(t);
} }
NS_HANDLER NS_HANDLER
@ -1251,11 +1365,10 @@ main(int argc, char** argv, char **env)
conn = [NSConnection defaultConnection]; conn = [NSConnection defaultConnection];
[conn setRootObject: server]; [conn setRootObject: server];
[conn setDelegate: server]; [conn setDelegate: server];
[[NSNotificationCenter defaultCenter] [[NSNotificationCenter defaultCenter] addObserver: server
addObserver: server selector: @selector(connectionBecameInvalid:)
selector: @selector(connectionBecameInvalid:) name: NSConnectionDidDieNotification
name: NSConnectionDidDieNotification object: (id)conn];
object: (id)conn];
connections = [NSMutableArray new]; connections = [NSMutableArray new];