0

I have a simple NSTask which runs a shell command, and a NSPipe file handle for reading which is used to read the output of the command and writes out to a file. When this command terminates and the output is written to file, Activity Monitor and Xcode memory monitor shows 700mb of usage which never goes down. I have wrapped the NSData output in an autoreleasepool and the whole task is in it's own function so there is no reason I can see for the high usage when the task is finished. I have profiled this with instruments and there are apparently no leaks and only a few KB of persistent memory after the command runs.

- (void)extractLogs forDate:(NSDate *)date
{
    __block NSError* err;
    NSDate *collectionEndDate = [[NSCalendar currentCalendar]dateByAddingUnit:NSCalendarUnitDay
                                                                           value:1
                                                                          toDate:_collectionStartDate
                                                                         options:0];
   [NSString stringWithFormat:@"%@",collectionEndDate];
    NSPipe *pipe = [NSPipe new];
    NSTask *logRetrievalTask = [[NSTask alloc]init];
    [logRetrievalTask setLaunchPath:@"/bin/bash"];
    NSString *cmd = [[NSString alloc]initWithFormat:@"/usr/bin/log show --signpost --no-pager --source --style syslog --start %@ --end %@ --predicate \"%@\" | %@",
                     [_collectionStartDate logFormattedDateString],
                     [collectionEndDate logFormattedDateString],
                     [NSString stringWithFormat:@"subsystem == '%@'", "com.xxx.xxxxx"],
                     LOG_TRANSFORM_COMMAND];
    [logRetrievalTask setArguments:@[@"-c",
                                     cmd]];
    
    [logRetrievalTask setStandardOutput:pipe];
    NSURL *logFileUrl = [self logFilePathForSubsystem:system usingDateString:[_collectionStartDate sduLogFormattedDateString]];
    __block FileStreamCompressor *compressor = [[FileStreamCompressor alloc]
                                                   initWithFilePath:[logFileUrl path]
                                                   maxFileSize:MB_IN_BYTES([self maxFileSize])
                                                   currentTotalBytes: _totalLogBytes];
    if (compressor == nil)
    {
        [[self logger]indicateFailureWith:[NSString stringWithFormat:@"Error: Could not create log file for: %@", system]];
        return;
    }
    
    [logRetrievalTask launch];
    NSData *logData = [[pipe fileHandleForReading]readDataToEndOfFile];
    [logRetrievalTask terminate];
    if ([logData length] == LOG_COMMAND_OUTPUT_HEADER_SIZE)
    {
        [compressor finishWritingStreamToFile];
        [self removeLogFileForSystem:system
                           usingDateString:[_collectionStartDate logFormattedDateString]
                               logFileErrorType:@"Empty log file"];
    } else {
        _totalLogBytes = [compressor compressData:logData error:&err];
        if (err != nil) {
            [compressor finishWritingStreamToFile];
            [[self logger]indicateWarningWith:[err localizedDescription]];
            [self removeLogFileForSystem:system
                                usingDateString:[_collectionStartDate logFormattedDateString]
                                logFileErrorType:@"Corrupt logfile"];
            
        } else {
            [[self logger]indicateSuccessWith:[NSString stringWithFormat:@"Finished processing log: %@-%@.log.gz",
                                                     system,
                                                     [_collectionStartDate logFormattedDateString]]];

        }
    }
    
    [[pipe fileHandleForReading]closeFile];
    [[pipe fileHandleForWriting]closeFile];
}
  • Post a [mre] please. – Willeke Dec 04 '21 at 12:40
  • you can profile with instruments allocations tool, and see all allocations, make snapshots of 2 states, and see which one is still not released. I bet there's a leak in FileStreamCompressor, and it has nothing to do with NSTask. – battlmonstr Dec 05 '21 at 22:01

0 Answers0