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;
}
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ć :(. –
Tak, klient potwierdził mi wczoraj, że zniknął dla niego po ponownym uruchomieniu komputera. – mwoods