2009-08-08 4 views
1
을 반환 한 후

안녕 나는 다음과 같은 코드가 있습니다 :사용 NSTask : 응용 프로그램 동결 출력

- (IBAction)runTask:(id)sender { 
    NSTask *proc; 
    NSPipe *output; 
    NSData *data; 
    NSString *buffer; 

    proc = [[NSTask alloc] init]; 
    output = [[NSPipe alloc] init]; 

    [proc setLaunchPath:@"/bin/sh"]; 
    [proc setArguments:[NSArray arrayWithObjects: @"-c", @"/usr/bin/otool -L /Applications/TextEdit.app/Contents/MacOS/TextEdit | /usr/bin/awk 'NR>1{print $1}' | /usr/bin/sed -e '/@executable_path/d' -e 's/(.*)$//' -e 's/\\/Versions.*$//'", nil]]; 
    [proc launch]; 

    data = [[output fileHandleForReading] readDataToEndOfFile]; 
    buffer = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
    NSLog(@"got: %@", buffer); 

    // Release 
    [proc release]; 
    [output release]; 
    [buffer release]; 
    [data release]; 
} 

코드의 목적은 그것이 사용 후 바이너리가 사용하는 공유 라이브러리의 목록을 얻을 수 otool을 사용, 좀 복잡하다 sed와 awk를 사용하여 기계로 읽을 수있는 형식으로 필터링합니다. 테스트를 위해 Mac OS X TextEdit.app의 이진 파일을 사용했습니다.

문제는 코드가 실행되고 출력을 반환하지만 앱이 정지된다는 것입니다. 나는 줄 단위로 살펴 보았고이 줄이 문제가되는 것을 발견했다 :

data = [[output fileHandleForReading] readDataToEndOfFile];

이 줄은 출력을 콘솔에 로깅 한 다음 응용 프로그램을 고정시킵니다. 나는 그 행 다음에 다른 모든 행들을 삭제함으로써 이것을 검사했고, 출력을 계속 기록하고 멈춘다. 디버거에는 아무 것도 없으며이 문제를 해결하는 방법에 대한 제안은 크게 감사 할 것입니다. 당신이

[proc setStandardOutput:output]; 
+1

: '메시지를, 그것을 실행. 끝 부분에'데이터 '를 과도하게 릴리스한다는 점을 제외하고는 정상적으로 작동합니다. –

+0

"그 줄 다음에 다른 줄을 모두 지워서 확인했습니다 ..."대신 앱을 샘플링하는 것이 좋습니다. 남자 1 견본을보십시오. –

답변

1

,

그 NSTask이 실행 된 후 모든 로깅이 작동하지 않는 것으로 알려진 버그. 출력을 반환하고 있습니다. 단지 출력하지 않습니다. 이 솔루션은이 줄을 추가했다 :

[task setStandardInput:[NSPipe pipe]]; 

을 그리고 모든 작동합니다 :) 내가 명령 줄 도구에 코드를 복사 누락 된`setStandardOutput을 추가

2

그것은 당신이 마지막 나오지 문장의 끝에 슬래시가 보인다. 제거하면 스크립트가 정상적으로 작동합니다.

출력 [NSPipe 파이프 (소유되지 않은) 후 출력 [PROC의 setStandardOutput : 출력]을 표준 출력으로 설정되어야로 만들어 져야
+0

나는 그 라인을 추가했지만 지금은 출력이 전혀없는 것처럼 보인다. – indragie

0

누락있는 것처럼

+0

올바른 슬래시를 제거했는지 확신 할 수 없지만 마지막 sed 문의 맨 끝에 하나를 빼 냈습니다.이 줄은 지금 다음과 같습니다. [proc setArguments : [NSArray arrayWithObjects : @ "- c", @/usr/bin/sed -e '/ @ executable_path "/ usr/bin/otool -L/응용 프로그램/텍스트 편집기/응용 프로그램/텍스트/텍스트 편집기 |/d '-e's /(.*)$// '-e's/\\/Versions. * $/' ", nil]]; 그러나이 오류가 발생합니다. sed : 1 : "s/\/Versions. * $/\ n": 대체 패턴 내에서 이스케이프 처리되지 않은 개행 – indragie

+0

아 또한 명령 자체에 문제가 있다고 생각하지 않습니다. , 나는 아주 간단한 "ls/Volumes"을 시도했고 똑같은 일이 발생했다. 출력은 반환되지만 앱은 멈춘다. 이전 포스터에서 제안한대로 setStandardOutput 행에 추가했습니다. 그 동안 고정 문제를 해결했지만 더 이상 출력이 없습니다. 감사합니다. – indragie

+0

PCWiz : 아, 명령을 시도하기 전에 백 슬래시를 이스케이프하는 것을 잊어 버렸습니다. 마지막 패턴이 어디에서 끝나야하는지 실제로보기 위해 읽지 않았습니다. 그 마지막 슬래시가 거기에 속합니다. 죄송합니다. –

0

데이터를 방출하기 때문에

하지만 충돌하는 이유 인 당신은 할당하지 않았고 새로운 것이거나 복사되었습니다. memory management rules을 참조하십시오.

또한이 코드를 잘 구현하려면 Quickies for NSTask을 참조하십시오. 이 문제의 해결책은 간단했다