Лимитът на NSLog е надвишен как да се заобиколи, разшири или прихване

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

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

Когато използвах собствен лог файл вместо NSLog, стартирането на MobileSafari отне твърде много време и беше убит. Възможно ли е да се закачи функция и да се регистрират нейните функционални аргументи (логифициране за базирани на 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