我有一个多线程应用程序,它在我的所有测试机器上都非常稳定,并且对于几乎每一位用户来说似乎都是稳定的(基于没有崩溃投诉)。

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 调试指南

来自: stackoverflow.com