0

NSAssert 在运行调试器时在 Xcode 4(最高 4.6 包括在内)中运行良好。断言触发,你断点它,然后它输出断言消息。

但是当在调试器之外运行时(在设备上调试构建),断言会触发 - 但没有消息。

这使得断言毫无用处:您可以看到断言的行号,但程序员的详细信息已被擦除。

这是 Xcode 的问题吗?铿锵声/LLVM 问题?是设置错误的值吗?或者有解决方法吗?


示例代码:

NSAssert(FALSE, @"X was invalid: %i", x );

示例输出(控制台):

<Warning>: *** Assertion failure in -[myClass method:], myClass.m:124
<Notice>: Formulating crash report for process MyApp[82]

预期输出(控制台):

<Warning>: *** Assertion failure in -[myClass method:], myClass.m:124
<Warning>: *** "X was invalid: -435"
<Notice>: Formulating crash report for process MyApp[82]

注意:我只是猜测 Apple 将如何格式化断言消息。


更新:发现问题。我原来的描述有误:

在调试器中运行时消息未输出到控制台

4

2 回答 2

3

两个观察:

  1. NSAssert仅用于调试目的。当您构建应用程序的发布版本时,NSAssert什么也不做。

  2. 当您NSAssert在设备上运行的应用程序的调试版本中使用(而不是通过调试器)时,消息在设备的控制台中,而不是在 Xcode 中。如果你去 Xcode 中的“Organizer”,选择“Devices”,选择你的设备并查看“Console”,你会在那里看到你的断言。

例如,我在“断言测试”应用程序中输入了一行代码:

NSAssert(FALSE, @"Assertion performed here");

当我通过 Xcode 的 Organizer 查看设备的“控制台”时,我看到:

8 月 6 日 09:10:53 Rob-iPod amfid[200]:8 月 6 日 09:10:53 SecTrustEvaluate [叶 CriticalExtensions IssuerCommonName]
8 月 6 日 09:10:53 Rob-iPod 断言测试 [199]:*** -[ViewController viewDidLoad] 中的断言失败,/Users/rryan/Documents/Development/Xcode/Assertion Test/Assertion Test/ViewController.m:21
8 月 6 日 09:10:53 Rob-iPod 内核[0]:launchd[199] 内置配置文件:容器(沙盒)
8 月 6 日 09:10:53 Rob-iPod 内核[0]:launchd[199] 容器:/private/var/mobile/Applications/7A7A62EF-8CEC-4388-932D-5C02DE77B841(沙盒)
8 月 6 日 09:10:53 Rob-iPod 断言测试 [199]:*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“此处执行的断言”
    *** 首先抛出调用堆栈:
    (0x315592a3 0x391d797f 0x3155915d 0x31e2eab7 0x843f7 0x33380595 0x333c0d79 0x333bcaed 0x333fe1e9 0x333c183f 0x333b984b 0x33361c39 0x333616cd 0x3336111b 0x350535a3 0x350531d3 0x3152e173 0x3152e117 0x3152cf99 0x3149febd 0x3149fd49 0x333b8485 0x333b5301 0x84149 0x3960eb20)
8 月 6 日 09:10:54 Rob-iPod ReportCrash[201]:为进程断言测试制定崩溃报告 [199]
8 月 6 日 09:10:54 Rob-iPod com.apple.launchd[1] (UIKitApplication:com.robertmryan.Assertion-Test[0x7be0][199]) : (UIKitApplication:com.robertmryan.Assertion-Test[0x7be0])作业似乎已崩溃:中止陷阱:6
8 月 6 日 09:10:54 Rob-iPod backboardd[26]:应用程序 'UIKitApplication:com.robertmryan.Assertion-Test[0x7be0]' 异常退出,信号 6:中止陷阱:6
8 月 6 日 09:10:54 Rob-iPod ReportCrash[201]:libMobileGestalt copySystemVersionDictionaryValue:无法从系统版本字典中查找 ReleaseType
8 月 6 日 09:10:54 Rob-iPod ReportCrash[201]:将 crashreport 保存到 /var/mobile/Library/Logs/CrashReporter/Assertion Test_2013-08-06-091053_Rob-iPod.plist using uid: 0 gid: 0, synthesis_euid :501 例如:0

如果您查看第五行,您将在那里看到断言消息。

于 2013-08-06T13:08:55.617 回答
0

这是非常具体的情况......我没有意识到,但我们在应用程序中嵌入了 HockeyApp / QuincyKit。

曲棍球似乎有一个讨厌的错误:

  1. 捕获 NSAssertions
  2. 允许他们崩溃
  3. 删除消息
  4. 删除日志
  5. ... 不曲棍球网站上传任何内容

所以......消息在调试器中可见,但仅在调试器变量中 - 我是个傻瓜,没有注意:它们没有出现在控制台中。


需要明确的是:某些断言有时会出现在 Hockey 中(查看 Hockey 控制台),但大多数断言都默默地丢失了。出现 100% 的 App 崩溃,但只有大约 10% 的断言崩溃。

于 2013-08-06T15:31:21.677 回答