“EXC_BREAKPOINT(SIGTRAP)”由debugging断点引起的exception吗?

我有一个multithreading的应用程序,在我的所有testing机器上都非常稳定,似乎几乎每个用户都稳定(基于没有崩溃的抱怨)。 应用程序经常为一个用户崩溃,但是,谁发送崩溃报告。 所有的崩溃报告(~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]提前检查字体的可用性。 可悲的是,这些变化并没有解决问题。

我现在已经注意到我忘了删除一些debugging断点,包括_NSLockError,[NSException raise]和objc_exception_throw。 但是,该应用程序绝对是使用“发布”作为活动构buildconfiguration构build的。 我假定使用“释放”configuration可以防止设置任何断点 – 但是我不能确定断点是如何工作的,或者是否需要从gdb中运行程序以使断点有效。

我的问题是:我可以离开的断点设置为用户观察到的崩溃的原因? 如果是这样,为什么断点只会造成这个用户的问题? 如果没有,还有其他人有类似的问题[NSFont fontWithName:size:]?

我可能会尝试删除断点并发送回用户,但我不知道多less货币我已经离开与该用户。 我想更多地了解是否留下设置的断点可能会导致一个问题(当应用程序使用“释放”configuration时)。

“EXC_BREAKPOINT(SIGTRAP)”由debugging断点引起的exception吗?

其他的方法实际上:一个SIGTRAP(跟踪陷阱)将导致debugging器中断你的程序,就像实际的断点一样。 但那是因为debugging器总是在崩溃时崩溃,SIGTRAP(就像其他几个信号一样 )是一种崩溃。

SIGTRAPs通常是由抛出NSExceptions引起的,但并不总是 – 甚至可以直接自己提出一个。

我现在已经注意到我忘了删除一些debugging断点,包括_NSLockError,[NSException raise]和objc_exception_throw。

那些不是断点。 其中两个是函数和-[NSException raise]是一个方法。

你是说你这些function和方法设置了断点吗?

我假定使用“释放”configuration可以防止设置任何断点 –

没有。

configuration是构buildconfiguration。 它们影响Xcode如何构build您的应用程序。

断点不是构build的一部分; 你在debugging器中设置它们。 他们只存在,只有打中,只有当你在debugging器下运行你的程序停止你的程序。

由于它们不是构build的一部分,因此仅通过向用户提供应用程序包,就不可能将断点传递给用户。

我不确定断点是如何工作的

当你的程序碰到断点的时候,debugging器会中断(中断)你的程序,于是你可以检查程序的状态并小心地前进,看看程序出错了。

由于它是停止程序的debugging器,因此在debugging器下运行程序时,断点不起作用。

…或者程序是否需要从gdb中运行,以产生任何效果。

它确实。 debugging器断点只能在debugging器内工作。

我的问题是:我可以离开的断点设置为用户观察到的崩溃的原因?

没有。

首先,如上所述,即使这些断点以某种方式进入用户系统,断点只在debugging器中有效。 如果程序没有在debugging器下运行,debugging器不能停在断点上。 用户几乎可以肯定是不是在debugging器下运行你的应用程序,特别是因为他们得到了崩溃日志。

即使他们确实在debugging器中运行了所有这些断点的情况下,只有当程序到达这个点时才会触发一个断点,所以如果你或者Cocoa调用了_NSLockError-[NSException raise] ,或者objc_exception_throw 。 到这一点不会是问题的原因,这将是问题的症状。

如果你因为被调用的结果而崩溃,你的崩溃日志至less会有一个命名。 它不。

所以,这与你的断点(不同的机器,debugging器没有涉及)没有关系,而且也不是Cocoaexception – 正如我所提到的,Cocoaexception是SIGTRAPs的一个原因,但它们不是唯一的原因。 你遇到了一个不同的。

如果没有,还有其他人有类似的问题[NSFont fontWithName:size:]?

我们无法判断我们所遇到的任何问题是否因为您切断了崩溃日志而相似。 我们对事故发生的背景一无所知。

唯一有用的是“二进制映像”部分,因为我们没有dSYM捆绑包,这意味着我们不能用这个部分来表示崩溃日志。

另一方面,你可以。 我为此写了一个应用程序 ; 将崩溃日志提供给它,它应该自动检测到dSYM包(对于你发布的每个发布版本,你保留dSYM包,对不对?),并将函数和方法名称恢复到函数和方法出现的堆栈跟踪。

有关更多信息,请参阅Xcodedebugging指南 。

该用户极有可能安装了损坏的字体。 堆栈跟踪肯定支持这个假设,因为它只影响一个用户。

在这种情况下,除了让用户删除违规字体之外,没有什么可以做的,因为发生的崩溃发生在Apple的代码中。

尝试让用户在Font Book中运行字体validation。 为此,请启动Font Book,单击源列表中的All Fonts ,然后select所有列出的字体。 然后,您可以从“ 文件”菜单中select“ validation字体 ”。

我有同样的错误。 出于无法解释的原因,断点是引发EXC_BREAKPOINTexception的责任。 解决scheme是删除断点,然后代码工作。

EXC_BREAKPOINT是一种debugging器使用的exception。 在代码中设置断点时,编译器会在可执行代码中插入此types的exception。 当执行到达那个点时,抛出exception并且debugging器捕获它。 然后debugging器在“breakpointed”行显示你的代码。 这是debugging器的工作原理。 但是在这种情况下,debugging器不能正确处理exception,并且显示为常规exception错误。

我在我的生活中发现了这个错误两次:

  • 一个大约一年前使用Xcode。
  • 另一个使用Visual C ++约15年前。

断点不写入二进制文件。 赔率是好的,这个人有一个错误的操作系统安装。 检查控制台日志中的dyld消息。