2012-03-16 1 views
0

MobileSafari에서 특정 작업을 수행하는 데 필요한 기능을 호출하기 위해 Mobilesubstrate tweak을 작성했습니다. 나는이 팅겨을 작성 NSLog 출력을 리디렉션하고 다음과 같은 메시지가 많은 보았다NSLog 한계를 초과하여 회피, 확장 또는 캡처하는 방법

내가 대신 NSLog의 자신의 로그 파일에 의해 사용
process 778 exceeded 500 log message per second limit - remaining messages this second discarded 

가 MobileSafari가 시작하는 시간이 오래 걸렸다 살해되었다. 함수를 연결하고 해당 함수 인수 (C 기반 함수에 대해 로깅) 및 시간/데이터를 기록 할 수 있습니까? ASL 라이브러리와 같은 사용 가능한 메소드를 사용하여 iPhone (jailbroken)에서 사용자 정의 로깅 기능을 사용할 수 있습니까?

EDIT : NSOperationQueue, NSOperation이라는 LoggingOperation을 만들고 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 

나는 또한 편의를 생성

,745 : 방법 후크 자체에서

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

버퍼링, 메시지 대기열 및 작업자 스레드의 저장소에 대한 오프로드 쓰기 (비싼)를 사용하기 위해 자체 로깅 라이브러리를 최적화 할 수 있습니다. –

+0

ok guys, 큰 상처가 나더라도, 인터페이스에서 잘못된 이벤트 인 '이벤트'가 발견되었습니다. 'Event'로 변경하면 이제는 내 로그 파일에 성공적으로 쓸 수 있습니다. – gigasai

+0

아니요 .. MobileSafari는 여전히 시간 내에 응답 할 수 없습니다. 드로잉 보드로 돌아갑니다. – gigasai

답변

1

나는 그것이 당신이 찾고있는 답이 아니라는 것을 알고있다. 그러나 당신의 로깅을 재고하고 생성 된 로그 문을 줄이는 것이 좋습니다. 나는 왜 당신이이 물건을 로깅하고 있는지에 대해 질문 할 것입니다. 그들은 정말로 당신에게 중요한 것을 말하고 있습니까? 디버그 세션에 정말로 필요한 경우 - 테스트를 위해 한 번만 실행되도록 설정하는 방법은 무엇입니까?

분명히 릴리스 버전에서는이 로깅을 사용하지 않을 것입니다.

저는 사람들이 Java에서 사용자 정의 로거를 작성하여 메서드 호출을 연결하고 매개 변수 및 모든 매개 변수를 기록하는 것을 보았습니다. 모든 경우에 대량의 데이터가 생성되고 시스템 속도가 느려지므로 시간 낭비가되었습니다. 로깅은 목표를 잘 정할 때 매우 유용합니다. 그것은 간결해야하며, 유용 할뿐 아니라 말할 가치가있을 때 생성되는 정보를 포함해야합니다.