Превышен лимит NSLog, как обходить, расширять или фиксировать

Я пишу настройку Mobilesubstrate, чтобы фиксировать функции, участвующие в выполнении конкретной задачи в MobileSafari, вместе с отметкой времени, в которой он был вызван. Я создал эту настройку и перенаправил вывод в NSLog и увидел многие из следующих сообщений:

process 778 exceeded 500 log message per second limit  -  remaining messages this second discarded

Когда я использовал собственный файл журнала вместо NSLog, MobileSafari запускался слишком долго и был убит. Можно ли подключить функцию и зарегистрировать ее аргументы функции (logify для функций на основе c) и время / данные, когда она вызывается с использованием метода с низкими накладными расходами? Возможно ли использование настраиваемого средства ведения журнала на iPhone (взломанного) с использованием таких доступных методов, как библиотеки ASL?

РЕДАКТИРОВАТЬ: я попытался обойти проблему, создав NSOperationQueue, NSOperation под названием LoggingOperation и встроив класс прямо в файл Tweak.xm. Я считаю, что это может помочь основному потоку обновить пользовательский интерфейс и завершить запуск MobileSafari. Настройка может компилироваться, но при срабатывании функции LoggingOperation не выполняет запись в файл, в результате чего создается пустой файл журнала:

//LoggingOperation.h
@interface LoggingOperation : NSOperation {
NSString *event;
}

@property(retain) NSString *Event;

- (id)initWithEvent:(NSString*)ev;

@end

Внутри реализации NSOperation:

//LoggingOperation.m
@implementation LoggingOperation

@synthesize Event;

- (id)initWithEvent:(NSString*)ev;
{
    if (![super init]) return nil;
    [self setEvent:ev];
    return self;
}

- (void)dealloc {
    [Event release], Event = nil;
    [super dealloc];
}

- (void)main {

    NSString *serverError = event;
    if (![[NSFileManager defaultManager] fileExistsAtPath:@"/var/mobile/mylog.log"])
    {
            NSString *statusFileName = [NSString stringWithFormat:@"/var/mobile/mylog.log"];    
            NSFileManager *fileManager = [NSFileManager defaultManager];
            [fileManager createFileAtPath:statusFileName contents:nil attributes:nil];
    }
    serverError = [serverError stringByAppendingString:@"\n"];
    NSString *serverFile = [NSString stringWithFormat:@"/var/mobile/mylog.log"];
    NSData *serverText= [serverError dataUsingEncoding:NSUTF8StringEncoding];
    NSFileHandle *serverFileHandle = [NSFileHandle fileHandleForUpdatingAtPath:serverFile]; 
    if (serverFileHandle)
    {
        [serverFileHandle seekToEndOfFile];
            // this NSLog output appears in syslog but serverText is not written to mylog
        NSLog(@"WRITING TO THE LOG FILE!");
        [serverFileHandle writeData:serverText]; 
        [serverFileHandle closeFile];
    }
}

@end

Я также создал удобный метод для каждого подключенного метода, вызываемого для создания журнала:

void mylog(NSString* serverError)
{
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    LoggingOperation *op = [[LoggingOperation alloc] initWithEvent:serverError];
    [queue addOperation:op];
    [op release];
}

В самом хуке метода:

CGRect replaced_CGRectIntegral (CGRect rect)
{
    mylog(@"CGRectIntegral(rect)");
    return o_CGRectIntegral(rect);
}

Интересно, почему я пишу в файл в NSOperation, а файл пуст?


person gigasai    schedule 16.03.2012    source источник
comment
Возможно, оптимизируйте свою собственную библиотеку ведения журнала для использования буферизации, очереди сообщений и записи разгрузки в хранилище (дорого) в рабочем потоке.   -  person Mike Clark    schedule 16.03.2012
comment
хорошо, ребята, моя большая проблема, я обнаружил, что ivar, event находится в неправильном регистре в интерфейсе. После изменения на Event теперь он может успешно записывать в мой файл журнала.   -  person gigasai    schedule 16.03.2012
comment
Нет .. MobileSafari все еще не может ответить вовремя .. его спиной к чертежной доске ..   -  person gigasai    schedule 16.03.2012


Ответы (1)


Я знаю, что это не тот ответ, который вы ищете, но я бы предложил переосмыслить ведение журнала и уменьшить количество генерируемых операторов журнала. Я бы задавал вопросы, почему вы регистрируете эти вещи? они действительно говорят тебе что-то важное? и если они вам действительно нужны для сеанса отладки - как вы можете настроить так, чтобы задача выполнялась только один раз для теста?

Очевидно, что в выпускной версии у вас не будет включено это ведение журнала.

Я видел, как в мире Java люди писали собственные регистраторы, чтобы подключаться к вызовам методов и регистрировать их и все их параметры. В любом случае это была пустая трата времени из-за огромного количества производимых данных и замедления работы системы. Ведение журнала чрезвычайно полезно при правильном нацеливании. Он должен быть кратким, содержать полезную информацию и генерироваться только тогда, когда есть что сказать.

person drekka    schedule 16.03.2012