我正在編寫一個Mobilesubstrate調整以捕獲在MobileSafari上執行特定任務時所涉及的函數以及調用它的時間戳。我創造了這個修改並重定向輸出的NSLog,看到許多如下消息:NSLog限制超出瞭如何解決方法,展開或捕獲
process 778 exceeded 500 log message per second limit - remaining messages this second discarded
當我使用自己的日誌文件,而不是的NSLog,MobileSafari花了太長時間來啓動和被殺害了。是否有可能掛鉤一個函數並記錄它的函數參數(logify for c基函數)和時間/數據,它使用低開銷方法調用它?在iPhone上使用自定義日誌記錄工具(越獄)和使用可用的方法,如ASL庫?
編輯: 我試着通過創建一個NSOperationQueue,一個名爲LoggingOperation的NSOperation,並將類嵌入到Tweak.xm文件中來解決該問題。我相信這可以緩解主線程以更新UI並完成啓動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中的文件並且文件是空的?
可能會優化您自己的日誌記錄庫,以便在工作線程上使用緩衝,消息隊列和卸載寫入存儲(昂貴)。 – 2012-03-16 01:47:50
好男人, 我的大壞,我發現,伊娃,'事件'是在界面錯誤的情況下。將其更改爲'Event'後,現在可以成功寫入我的日誌文件。 – gigasai 2012-03-16 08:51:36
沒有.. MobileSafari仍然無法及時迴應..它回到了繪圖板.. – gigasai 2012-03-16 09:07:29