2012-03-16 62 views
0

我正在編寫一個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中的文件並且文件是空的?

+0

可能會優化您自己的日誌記錄庫,以便在工作線程上使用緩衝,消息隊列和卸載寫入存儲(昂貴)。 – 2012-03-16 01:47:50

+0

好男人, 我的大壞,我發現,伊娃,'事件'是在界面錯誤的情況下。將其更改爲'Event'後,現在可以成功寫入我的日誌文件。 – gigasai 2012-03-16 08:51:36

+0

沒有.. MobileSafari仍然無法及時迴應..它回到了繪圖板.. – gigasai 2012-03-16 09:07:29

回答

1

我知道這不是您正在尋找的答案,但我會建議您重新考慮日誌記錄並減少生成的日誌語句的數量。我會問你爲什麼要記錄這些東西?他們真的在告訴你一些重要的事嗎?如果您確實需要它們進行調試會話 - 您如何設置以便該任務僅在測試中執行一次?

顯然在發行版本中,您不會打開此日誌記錄。

我見過人們在Java世界中編寫自定義記錄器來掛鉤方法調用並記錄它們及其所有參數。在所有情況下,由於大量數據產生和系統運行緩慢,浪費時間。有針對性的記錄非常有用。它必須簡明扼要,包含有用的信息,並且只有在有些事情值得說話時纔會產生。

相關問題