Я пишу настройку 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, и файл пуст?
Возможно, оптимизируйте свою собственную библиотеку регистрации, чтобы использовать буферизацию, очередь сообщений и разгрузочную запись в хранилище (дорогое) на рабочем потоке. –
ok guys, Мой большой плохой, я обнаружил, что ivar, 'event' находится в неправильном случае в интерфейсе. После его изменения на 'Event', теперь он может успешно записывать в файл журнала. – gigasai
Нет. MobileSafari все еще не может ответить вовремя .. назад к чертежной доске .. – gigasai