2014-05-14 11 views
8

wydaje mi się uzyskać wiele raportów o awariach tak:NSConcreteTask launchWithDictionary krach

Crashed Thread: 14 

Exception Type: EXC_GUARD 
Exception Codes: 0x4000000200000000, 0x00007fff96f73c48 

Thread 14 Crashed: 
0 libsystem_kernel.dylib    0x00007fff97b7213a dup + 10 
1 com.apple.Foundation    0x00007fff8a116cee -[NSConcreteTask launchWithDictionary:] + 2457 
2 com.mycompany.myapp 0x0000000100022814 +[MCSoftwareUpdate automaticallyCheckForUpdates] + 352 
3 com.apple.Foundation    0x00007fff89fed76b __NSThread__main__ + 1318 
4 libsystem_pthread.dylib    0x00007fff8d2e4899 _pthread_body + 138 
5 libsystem_pthread.dylib    0x00007fff8d2e472a _pthread_start + 137 
6 libsystem_pthread.dylib    0x00007fff8d2e8fc9 thread_start + 13 

To nie tylko wpływa na powyższą metodę - wpływa na dowolny kod, który używa NSTask. Zrobiłem kilka badań i zasugerowano, że naprawa uprawnień może naprawić problem, ale to nie jest zbyt użyteczne, ponieważ nie mam możliwości skontaktowania się z użytkownikami zgłaszającymi te awarie. Już umieszczam kod w bloku catch catch - czy jest coś jeszcze co mogę zrobić na moim końcu, aby go zminimalizować lub wyeliminować?

Napisałem następującą funkcję do owinięcia wokół NSTask.

Kod:

+ (BOOL)runTask:(NSString*)taskPath arguments:(NSArray*)args task:(NSTask**)taskObj 
{ 
    if (![[NSFileManager defaultManager] isExecutableFileAtPath:taskPath] || [[NSWorkspace sharedWorkspace] isFilePackageAtPath:taskPath]) { 
     NSLog(@"Error: %@ is not executable",taskPath); 
     return NO; 
    } 

    @try { 
     NSTask *task = [[NSTask alloc] init]; 

     if (taskObj != NULL) *taskObj = task; 

     [task setLaunchPath:taskPath]; 
     if (args) [task setArguments:args]; 
     [task setStandardError:[NSFileHandle fileHandleWithNullDevice]]; 
     [task setStandardOutput:[NSFileHandle fileHandleWithNullDevice]]; 

     [task launch]; 

     [task waitUntilExit]; 

     taskObj = nil; 
     [task release]; 

     return YES; 
    } 

    @catch (NSException *exc) { 
     NSLog(@"Exception running task %@: %@",taskPath,[exc reason]); 
    } 

    return NO; 
} 
+0

Widzę to w jednej z moich aplikacji, gdy systemowi zaczyna brakować uchwytów plików . Dziwnie, tylko wtedy, gdy moje aplikacje działają samodzielnie - po uruchomieniu dla Xcode, nie ulega awarii. Po ponownym uruchomieniu problem nie występuje. Ponieważ jest to sygnał, wychwytywanie wyjątków nie ma sensu, więc jest to naprawdę przerażające doświadczenie dla użytkownika, nie mogąc sobie z tym poradzić :(. –

+0

Tak, klient potwierdził mi wczoraj, że zniknął dla niego po ponownym uruchomieniu komputera. – mwoods

Odpowiedz

1

Jeśli restartu rozwiązuje problemu, wydaje się, że minimalizując swoje uchwyty plików może pomóc uniknąć tego problemu. Ale nadal próbowałbym odtworzyć problem lokalnie, tworząc wiele uchwytów plików bez ich zamykania, abyś był pewien, co powoduje awarię.

Widzę, że tworzysz uchwyt pliku podczas przekazywania go jako parametr. Zapobiega to kontrolowaniu, kiedy uchwyt pliku jest zamknięty. Zamiast tego zachowałbym odniesienie do uchwytu pliku, aby można było zamknąć to okno, gdy nie jest już używane:

NSFileHandle *errorFileHandle = [NSFileHandle fileHandleWithNullDevice]; 
[task setStandardError:errorFileHandle]; 

NSFileHandle *outputFileHandle = [NSFileHandle fileHandleWithNullDevice]; 
[task setStandardOutput:outputFileHandle]; 

... 
//outputFileHandle is no longer used 
[outputFileHandle close]; 
Powiązane problemy