【发布时间】:2025-11-27 13:20:04
【问题描述】:
我有一个多线程应用程序,它在我的所有测试机器上都非常稳定,并且对于我的几乎每个用户来说似乎都是稳定的(基于没有崩溃的投诉)。但是,该应用程序经常为一位用户崩溃,该用户非常好心地发送崩溃报告。所有崩溃报告(约 10 个连续报告)看起来基本相同:
Date/Time: 2010-04-06 11:44:56.106 -0700
OS Version: Mac OS X 10.6.3 (10D573)
Report Version: 6
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Thread 0 Crashed: Dispatch queue: com.apple.main-thread
0 com.apple.CoreFoundation 0x90ab98d4 __CFBasicHashRehash + 3348
1 com.apple.CoreFoundation 0x90adf610 CFBasicHashRemoveValue + 1264
2 com.apple.CoreText 0x94e0069c TCFMutableSet::Intersect(__CFSet const*) const + 126
3 com.apple.CoreText 0x94dfe465 TDescriptorSource::CopyMandatoryMatchableRequest(__CFDictionary const*, __CFSet const*) + 115
4 com.apple.CoreText 0x94dfdda6 TDescriptorSource::CopyDescriptorsForRequest(__CFDictionary const*, __CFSet const*, long (*)(void const*, void const*, void*), void*, unsigned long) const + 40
5 com.apple.CoreText 0x94e00377 TDescriptor::CreateMatchingDescriptors(__CFSet const*, unsigned long) const + 135
6 com.apple.AppKit 0x961f5952 __NSFontFactoryWithName + 904
7 com.apple.AppKit 0x961f54f0 +[NSFont fontWithName:size:] + 39
(....更多文字如下)
首先,我花了很长时间研究 [NSFont fontWithName:size:]。我想也许用户的字体以某种方式搞砸了,所以 [NSFont fontWithName:size:] 请求的东西不存在并且因此失败。我使用 [[NSFontManager sharedFontManager] availableFontNamesWithTraits:NSItalicFontMask] 添加了一堆代码来提前检查字体的可用性。遗憾的是,这些更改并没有解决问题。
我现在注意到我忘记删除一些调试断点,包括 _NSLockError、[NSException raise] 和 objc_exception_throw。但是,该应用程序肯定是使用“发布”作为活动构建配置构建的。我假设使用“Release”配置可以防止设置任何断点——但我又不确定断点是如何工作的,或者是否需要从 gdb 中运行程序才能使断点产生任何影响。
我的问题是:我设置的断点是否会导致用户观察到崩溃?如果是这样,为什么断点只会对这个用户造成问题?如果没有,还有其他人对 [NSFont fontWithName:size:] 有类似的问题吗?
我可能会尝试删除断点并将其发回给用户,但我不确定该用户还剩下多少货币。而且我想更一般地了解保留断点设置是否可能会导致问题(当应用程序是使用“发布”配置构建时)。
【问题讨论】:
标签: cocoa macos exception gdb breakpoints