Я пишу настройку 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, а файл пуст?
event
находится в неправильном регистре в интерфейсе. После изменения наEvent
теперь он может успешно записывать в мой файл журнала. - person gigasai   schedule 16.03.2012