我有一个多线程应用程序,它在我的所有测试机器上都非常稳定,并且对于几乎每一位用户来说似乎都是稳定的(基于没有崩溃投诉)。
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:]。
I’ve now noticed that I forgot to remove some debugging breakpoints, including _NSLockError, [NSException raise], and objc_exception_throw. However, the app was definitely built using “Release” as the active build configuration. I assume that using the “Release” configuration prevents setting of any breakpoints–but then again I am not sure exactly how breakpoints work or whether the program needs to be run from within gdb for breakpoints to have any effect.
我的问题是:我留下的断点设置可能是用户观察到的崩溃的原因吗?
我可能会尝试删除断点并将其发送回用户,但我不确定我还留给该用户多少货币。
答案
“EXC_BREAKPOINT (SIGTRAP)“异常是调试断点引起的吗?
不。实际上,反过来说:SIGTRAP(跟踪陷阱)将导致调试器中断(中断)您的程序,就像实际断点一样。信号)是崩溃的一种类型。
SIGTRAPs are generally caused by NSExceptions being thrown, but not always—it’s even possible to directly 增加一个你自己。
I’ve now noticed that I forgot to remove some debugging breakpoints, including _NSLockError, [NSException raise], and objc_exception_throw.
这些不是断点。-[NSException raise]
是一种方法。
你的意思是你设置了断点在那些函数和方法?
我假设使用"Release"配置可以防止设置任何断点 -
不。
配置是建造配置。
断点不是构建的一部分;
由于它们不是构建的一部分,因此不可能仅通过向用户提供应用程序包来将断点传递给用户。
我不确定断点到底是如何工作的……
当您的程序到达断点时,调试器会中断(中断)您的程序,此时您可以检查程序的状态并仔细向前查看程序如何出错。
由于调试器会停止程序,因此当您不在调试器下运行程序时,断点不起作用。
…或者程序是否需要从 gdb 中运行才能使断点产生任何效果。
确实如此。
我的问题是:我留下的断点设置可能是用户观察到的崩溃的原因吗?
不。
首先,如上所述,即使这些断点确实以某种方式转移到用户的系统中,断点也只在调试器中有效。
即使他们确实在设置了所有这些断点的调试器下运行您的应用程序,只有当您的程序到达该点时才会触发断点,因此只有当您或 Cocoa 调用时,这些断点之一才会触发_NSLockError
,-[NSException raise]
, 或者objc_exception_throw
。
如果您确实因调用其中之一而崩溃,则您的崩溃日志中将至少有其中一个被命名。
所以,这与你的断点无关(不同的机器,不涉及调试器),并且它不是 Cocoa 异常 - 正如我提到的,Cocoa 异常是 SIGTRAP 的原因之一,但它们不是唯一的原因。
如果没有,其他人是否对 [NSFont fontWithName:size:] 有类似的问题?
我们无法判断我们遇到的问题是否相似,因为您切断了崩溃日志。
唯一需要删除的是"二进制图像"部分,因为我们没有您的 dSYM 包,这意味着我们无法使用该部分来表示崩溃日志。
另一方面,你可以。一个应用程序以此目的;
欲了解更多信息,请参阅Xcode 调试指南。