Hi all,

Thanks to everyone for their suggestions. I spent far too much time working 
around this bug, but have finally got to the bottom of the original issue.

It turns out this is a known issue with some other apps as well, and (thanks to 
https://trac.cyberduck.io/ticket/11231#comment:25 
<https://trac.cyberduck.io/ticket/11231#comment:25> ) can be fixed by removing 
an obscure preference key from the User Defaults system.

I was able to reproduce the issue by setting the 
__NSDisableSharingTextTabInstance key to YES using the "defaults write" command.

I've solved it by removing that key in my -applicationDidFinishLaunching method:
        [[NSUserDefaults standardUserDefaults] removeObjectForKey: 
@"__NSDisableSharingTextTabInstance"];

Looks like someone has already submitted a bug report to Apple for it 
(https://openradar.appspot.com/FB8930278 
<https://openradar.appspot.com/FB8930278> ) so I'm just posting this here in 
case it helps anyone else in the future.

Best regards,
Mark 

> On 29 Mar 2021, at 7:01 pm, Martin Wierschin via Cocoa-dev 
> <cocoa-dev@lists.apple.com> wrote:
> 
> Breaking the RTFD loading process down into subtasks is a good idea. It might 
> be worth trying to sidestep the issue using NSAttributedString. You can try 
> loading the data yourself as Mike suggested and then use initWithRTFD or 
> initWithRTFDFileWrapper. Once you have the text in an attributed string you 
> can swap its content into your NSTextView/NSTextStorage using 
> -replaceCharactersInRange:withAttributedString:
> 
> However, I suspect the problem will remain. The exception is coming from 
> Apple's internal NSRTFReader class, which we can be reasonably certain is 
> utilized by all RTF/RTFD loading code paths. To really fix this you're 
> probably going to be stuck with ugly code that either:
> 
> 1. Preprocess the RTFD to remove the data that Apple's code can't handle, eg: 
> strip tab stops as someone else suggested.
> 2. Use method swizzling to patch Apple's buggy methods at runtime, eg: 
> replace -[NSRTFReader defaultParagraphStyle] to avert the conditions that 
> lead to the exception, before it gets thrown in the first place.
> 
> One other potential debugging aid: NSExceptionHandler. You can register your 
> own handler, perhaps in a way that prevents AppKit from killing your app 
> outright when an exception occurs (this used to be possible but I don't know 
> the current behavior). But as Mike said, this isn't a real solution for 
> shipping software. Generally speaking once an app has thrown an exception its 
> state can't be relied upon. So you should only use this for testing to gather 
> additional debug information.
> 
> ~Martin Wierschin
> 
>> On Mar 26, 2021, at 11:22 AM, Mike Abdullah via Cocoa-dev 
>> <cocoa-dev@lists.apple.com> wrote:
>> 
>> This does seem quite surprising. However, here’s the thing: this code is 
>> very strange approach to take.
>> 
>> Number 1: Cocoa doesn’t support exceptions as an error-handling mechanism 
>> except where explicitly stated and supported. You’re trying to use them, 
>> which is asking for trouble. The system doesn’t guarantee proper handling of 
>> memory if an exception does throw.
>> 
>> Number 2: Your error handling approach is back-to-front. You’re trying an 
>> operation, seeing if it fails, then attempting to guess from the current 
>> state (which might have changed in the meantime) why it might have failed.
>> 
>> Instead, use the proper error APIs and approach:
>> 
>> 1. Load the data from disk, e.g. +[NSData 
>> dataWithContentsOfURL:options:error:]
>> 
>> If that fails you can introspect the error to your heart’s content to find 
>> out what went wrong
>> 
>> 2. Load the data into your text view. I’m not sure if there’s an API to do 
>> that in a single step or not, dunno.
>> 
>> I also note that your code explicitly is trying to read an RTFD which if 
>> memory serves can be a document *bundle* format, so perhaps at step 1 you’d 
>> have to go with a file wrapper. But the path you specify is .rtf so I’m 
>> guessing you really do have a basic file and can load it as data.
>> 
>> Mike.
>> 
>>> On 26 Mar 2021, at 11:11, Mark Allan via Cocoa-dev 
>>> <cocoa-dev@lists.apple.com> wrote:
>>> 
>>> Hi folks,
>>> 
>>> Some users are reporting a crash that I can't reproduce, and in an attempt 
>>> to gain additional diagnostics from a user, I wrapped the affected line in 
>>> a try/catch block.  For two users it resolve the crash, but for a third, 
>>> it's still crashing at the same point!
>>> 
>>> The crash occurs when a user attempts to open the "About" window from my 
>>> app's main menu item. I'm not using the standard about panel as there's a 
>>> few additional items I need to display, one of which is an NSTextView which 
>>> I populate with the contents of an RTF file from within the app bundle.
>>> 
>>> I've symbolicated the crash log to find it's happening when populating that 
>>> TextView. The line in question now reads as follows:
>>> 
>>>     @try {
>>>             [self.aboutBox.creditsTextView readRTFDFromFile:[[NSBundle 
>>> mainBundle] pathForResource:@"Credits" ofType:@"rtf"]];
>>>     } @catch (NSException *exception) {
>>>             NSLog(@"Error loading the contents of the text file for the 
>>> About Box. %@", exception);
>>>             //Check we have a file at the expected path 
>>>             if([[NSFileManager defaultManager] fileExistsAtPath:[[NSBundle 
>>> mainBundle] pathForResource:@"Credits" ofType:@"rtf"]]){
>>>                     NSLog(@"Yes. Found the RTF credits file");
>>>                     // check the attributes in case somehow there's no 
>>> permission to read the file
>>>                     NSDictionary *fileAttributes = [[NSFileManager 
>>> defaultManager] attributesOfItemAtPath:[[NSBundle mainBundle] 
>>> pathForResource:@"Credits" ofType:@"rtf"] error:nil];
>>>                     NSLog(@"RTF file has following attributes %@", 
>>> fileAttributes);
>>>             }
>>>             else {
>>>                     NSLog(@"Nope, file not found");
>>>             }
>>>     }
>>> 
>>> This is the crash log from the newest build (with the try/catch around that 
>>> line):
>>> 
>>>> Performing @selector(showAboutBox:) from sender NSMenuItem 0x600000634540
>>>> *** Terminating app due to uncaught exception 
>>>> 'NSInvalidArgumentException', reason: '*** -[__NSArrayM 
>>>> insertObject:atIndex:]: object cannot be nil'
>>>> terminating with uncaught exception of type NSException
>>>> abort() called
>>>> 
>>>> Application Specific Backtrace 1:
>>>> 0   CoreFoundation                      0x00007fff206ea6af 
>>>> __exceptionPreprocess + 242
>>>> 1   libobjc.A.dylib                     0x00007fff204223c9 
>>>> objc_exception_throw + 48
>>>> 2   CoreFoundation                      0x00007fff2079ea9a -[__NSCFString 
>>>> characterAtIndex:].cold.1 + 0
>>>> 3   CoreFoundation                      0x00007fff2079c953 -[__NSArrayM 
>>>> insertObject:atIndex:].cold.2 + 0
>>>> 4   CoreFoundation                      0x00007fff20610421 -[__NSArrayM 
>>>> insertObject:atIndex:] + 1135
>>>> 5   UIFoundation                        0x00007fff23c223ab 
>>>> __defaultTabStops_block_invoke + 161
>>>> 6   libdispatch.dylib                   0x00007fff203cd7c7 
>>>> _dispatch_client_callout + 8
>>>> 7   libdispatch.dylib                   0x00007fff203ce96b 
>>>> _dispatch_once_callout + 20
>>>> 8   UIFoundation                        0x00007fff23c229d7 
>>>> -[NSMutableParagraphStyle setTabStops:] + 199
>>>> 9   UIFoundation                        0x00007fff23c3c697 -[NSRTFReader 
>>>> defaultParagraphStyle] + 75
>>>> 10  UIFoundation                        0x00007fff23c3c5be -[NSRTFReader 
>>>> _mutableParagraphStyle] + 112
>>>> 11  UIFoundation                        0x00007fff23c36113 controlClass + 
>>>> 1757
>>>> 12  UIFoundation                        0x00007fff23c356b4 -[NSRTFReader 
>>>> attributedString] + 76
>>>> 13  UIFoundation                        0x00007fff23c311a6 
>>>> _NSReadAttributedStringFromURLOrData + 3213
>>>> 14  UIFoundation                        0x00007fff23d46985 
>>>> -[NSAttributedString(NSAttributedStringUIFoundationAdditions) 
>>>> initWithURL:options:documentAttributes:error:] + 228
>>>> 15  AppKit                              0x00007fff23677d9a -[NSTextView 
>>>> readRTFDFromFile:] + 126
>>>> 16  MyAppHere                             0x0000000105fa18a7 MyAppHere+ 
>>>> 227495
>>>> 17  AppKit                              0x00007fff230af7fd 
>>>> -[NSApplication(NSResponder) sendAction:to:from:] + 283
>>>> 18  AppKit                              0x00007fff231b2611 -[NSMenuItem 
>>>> _corePerformAction] + 413
>>> 
>>> 
>>> Any ideas what's going on? Other than the file not being found, why else 
>>> might the object at line 3 in the backtrace be nil...and more 
>>> interestingly, why is the exception not being caught?
>>> 
>>> Thanks
>>> Mark

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to