2014-05-14 41 views
8

tôi dường như nhận được rất nhiều báo cáo sự cố như thế này:NSConcreteTask launchWithDictionary tai nạn

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 

Nó không chỉ ảnh hưởng đến các phương pháp trên - nó ảnh hưởng đến bất kỳ mã có sử dụng NSTask. Tôi đã thực hiện một số nghiên cứu và đề xuất rằng việc sửa chữa các quyền có thể khắc phục vấn đề, nhưng điều đó không hữu ích vì tôi không có cách nào để liên lạc với người dùng báo cáo các sự cố này. Tôi đã đặt mã trong một khối try try - có bất cứ điều gì khác tôi có thể làm ở cuối của tôi để giảm thiểu hoặc loại bỏ nó?

Tôi đã viết chức năng sau để quấn quanh NSTask.

Code:

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

Tôi thấy điều này trong một trong các ứng dụng của tôi, khi hệ thống sắp hết công suất . Thật kỳ lạ, chỉ khi các ứng dụng của tôi chạy độc lập - khi tôi chạy nó cho Xcode, nó không sụp đổ. Sau khi khởi động lại, vấn đề không tồn tại. Vì đó là một tín hiệu, ngoại lệ bắt không tốt, vì vậy đây thực sự là một trải nghiệm người dùng khủng khiếp, không thể xử lý được điều này: ( –

+0

Vâng, một khách hàng đã xác nhận với tôi hôm qua rằng nó biến mất sau khi khởi động lại. – mwoods

Trả lời

1

Nếu khởi động lại sửa chữa các vấn đề, sau đó có vẻ như giảm thiểu xử lý tập tin của bạn có thể giúp ngăn ngừa vấn đề này. Tuy nhiên, tôi vẫn cố gắng tái tạo vấn đề cục bộ, bằng cách tạo nhiều xử lý tệp mà không đóng chúng, để bạn biết chắc chắn nguyên nhân gây ra sự cố.

Tôi thấy rằng bạn đang tạo bộ xử lý tệp khi bạn chuyển nó làm tham số. Điều này ngăn cản bạn kiểm soát khi đóng tập tin đó. Thay vào đó, tôi sẽ giữ tham chiếu đến trình xử lý tệp để bạn có thể đóng tài khoản đó khi không còn sử dụng nữa:

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

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

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