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;
}
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: ( –
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