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