Author: mlytwyn
Date: Tue Dec  1 18:06:52 2015
New Revision: 39204

URL: http://svn.gna.org/viewcvs/gnustep?rev=39204&view=rev
Log:
Add logging to file for GPBS to debug associated gpbs crashes

Modified:
    libs/back/branches/gnustep_testplant_branch/Tools/gpbs.m

Modified: libs/back/branches/gnustep_testplant_branch/Tools/gpbs.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/back/branches/gnustep_testplant_branch/Tools/gpbs.m?rev=39204&r1=39203&r2=39204&view=diff
==============================================================================
--- libs/back/branches/gnustep_testplant_branch/Tools/gpbs.m    (original)
+++ libs/back/branches/gnustep_testplant_branch/Tools/gpbs.m    Tue Dec  1 
18:06:52 2015
@@ -736,27 +736,27 @@
 }
 
 - (int) declareTypes: (bycopy NSArray*)types
-              owner: (id)owner
-         pasteboard: (NSPasteboard*)pb
+               owner: (id)owner
+          pasteboard: (NSPasteboard*)pb
 {
   PasteboardEntry      *old = RETAIN(current);
-  id                   x = [xPbClass ownerByOsPb: name];
-
+  id               x   = [xPbClass ownerByOsPb: name];
+  
   if ([owner isProxy] == YES)
     {
       Protocol         *p = @protocol(GSPasteboardCallback);
       NSConnection     *c = [owner connectionForProxy];
-
+      
       [owner setProtocolForProxy: p];
-
+      
       /* 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
        * in order to auto_stop if necessary.
        */
       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
@@ -767,11 +767,11 @@
     x = nil;
   else if (x == [old owner])
     x = nil;
-
+  
   current = [PasteboardEntry newWithTypes: types
-                                   owner: owner
-                                  pboard: pb
-                                     ref: nextCount++];
+                                    owner: owner
+                                   pboard: pb
+                                      ref: nextCount++];
   [history addObject: current];
   RELEASE(current);
   if ([history count] > histLength)
@@ -789,7 +789,7 @@
   if (verbose)
     {
       NSLog(@"%@ declare types '%@' version %d on %@ for %@",
-       self, types, [current refNum], pb, owner);
+            self, types, [current refNum], pb, owner);
     }
   return [current refNum];
 }
@@ -961,14 +961,12 @@
 
 @implementation PasteboardServer
 
-- (BOOL) connection: (NSConnection*)ancestor
-  shouldMakeNewConnection: (NSConnection*)newConn;
-{
-  [[NSNotificationCenter defaultCenter]
-    addObserver: self
-       selector: @selector(connectionBecameInvalid:)
-          name: NSConnectionDidDieNotification
-        object: newConn];
+- (BOOL) connection: (NSConnection*)ancestor shouldMakeNewConnection: 
(NSConnection*)newConn;
+{
+  [[NSNotificationCenter defaultCenter] addObserver: self
+                                           selector: 
@selector(connectionBecameInvalid:)
+                                               name: 
NSConnectionDidDieNotification
+                                             object: newConn];
   [newConn setDelegate: self];
   return YES;
 }
@@ -988,9 +986,9 @@
       PasteboardObject *o;
 
       while ((o = [e nextObject]) != nil)
-       {
-         [o checkConnection: connection];
-       }
+        {
+          [o checkConnection: connection];
+        }
     }
   [connections removeObjectIdenticalTo: connection];
   if (auto_stop == YES && [connections count] == 0)
@@ -1044,7 +1042,7 @@
       +initializePasteboard will already have printed a warning in this case.
       */
       if (xPbClass && ![xPbClass initializePasteboard])
-       xPbClass = nil;
+        xPbClass = nil;
     }
   return self;
 }
@@ -1149,9 +1147,9 @@
          shouldFork = NO;
        }
       else if ([a isEqualToString: @"--verbose"] == YES)
-       {
-         verbose++;
-       }
+        {
+          verbose++;
+        }
       else if ([a hasPrefix: @"-"] == YES)
        {
          count++;      // Skip user default specification
@@ -1163,6 +1161,14 @@
          printf("--help        for help\n");
          exit(EXIT_SUCCESS);
        }
+    }
+
+  // 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++)
@@ -1195,16 +1201,124 @@
       t = [NSTask new];
       NS_DURING
        {
+          NSFileHandle   *outHandle = [NSFileHandle fileHandleWithNullDevice];
+          NSFileHandle   *errHandle = [NSFileHandle fileHandleWithNullDevice];
+          NSUserDefaults *defaults  = [NSUserDefaults standardUserDefaults];
+          
          [args removeObjectAtIndex: 0];
          [args addObject: @"--daemon"];
          [t setLaunchPath: [[NSBundle mainBundle] executablePath]];
          [t setArguments: args];
          [t setEnvironment: [pInfo environment]];
          null = [NSFileHandle fileHandleWithNullDevice];
-         [t setStandardInput: null];
-         [t setStandardOutput: null];
-         [t setStandardError: null];
+
+          // Default to stdin...
+          [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];
+          
+          // and release our hold...
          DESTROY(t);
        }
       NS_HANDLER
@@ -1251,11 +1365,10 @@
   conn = [NSConnection defaultConnection];
   [conn setRootObject: server];
   [conn setDelegate: server];
-  [[NSNotificationCenter defaultCenter]
-    addObserver: server
-       selector: @selector(connectionBecameInvalid:)
-          name: NSConnectionDidDieNotification
-        object: (id)conn];
+  [[NSNotificationCenter defaultCenter] addObserver: server
+                                           selector: 
@selector(connectionBecameInvalid:)
+                                               name: 
NSConnectionDidDieNotification
+                                             object: (id)conn];
 
   connections = [NSMutableArray new];
 


_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to