2012-03-16 1 views
0

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

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

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

EDIT: Я попытался обойти проблему, создав 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, и файл пуст?

+0

Возможно, оптимизируйте свою собственную библиотеку регистрации, чтобы использовать буферизацию, очередь сообщений и разгрузочную запись в хранилище (дорогое) на рабочем потоке. –

+0

ok guys, Мой большой плохой, я обнаружил, что ivar, 'event' находится в неправильном случае в интерфейсе. После его изменения на 'Event', теперь он может успешно записывать в файл журнала. – gigasai

+0

Нет. MobileSafari все еще не может ответить вовремя .. назад к чертежной доске .. – gigasai

ответ

1

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

Очевидно, что в версии с версией у вас не было бы этого входа в систему.

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