2014-05-14 17 views
8

mi sembra di avere un sacco di segnalazioni di crash in questo modo:NSConcreteTask launchWithDictionary incidente

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 

Esso non riguarda soltanto il metodo di cui sopra - colpisce qualsiasi codice che utilizza NSTask. Ho fatto alcune ricerche e mi è stato suggerito che riparare le autorizzazioni potesse risolvere il problema, ma non è molto utile perché non ho modo di entrare in contatto con gli utenti che segnalano questi arresti anomali. Sto già posizionando il codice in un blocco catch try: c'è qualcos'altro che posso fare alla mia estremità per minimizzarlo o eliminarlo?

Ho scritto la seguente funzione per avvolgere NSTask.

Codice:

+ (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

sto vedendo questo in una delle mie applicazioni, quando il sistema si sta scaricando sulle maniglie di file . Stranamente, solo quando le mie app funzionano in modo indipendente - quando lo eseguo per Xcode, non si blocca. Dopo un riavvio, il problema non persiste. Poiché si tratta di un segnale, la cattura di eccezioni non va bene, quindi questa è un'esperienza utente davvero terribile, non essendo in grado di gestirlo :(. –

+0

Sì, un cliente mi ha confermato ieri che è scomparso per lui dopo un riavvio. – mwoods

risposta

1

Se il riavvio risolve il problema, allora sembra che ridurre al minimo i file handle può aiutare a prevenire questo problema. Tuttavia, proverei ancora a riprodurre il problema localmente, creando molti handle di file senza chiuderli, in modo da sapere con certezza che cosa causa l'arresto.

Vedo che si sta creando l'handle del file mentre lo si passa come parametro. Ciò impedisce di controllare quando l'handle di quel file è chiuso. Vorrei invece mantenere un riferimento al manico file, in modo che si può chiudere quando non viene più utilizzato:

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

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

... 
//outputFileHandle is no longer used 
[outputFileHandle close]; 
Problemi correlati