运行调试器时,NSAssert在Xcode 4(最高4.6)中运行良好。断言触发,断点,然后输出断言消息。
但是当在外部运行调试器(在设备上调试构建)时,断言会触发 - 但没有消息。
这使得断言变得无用:你可以看到断言的行号,但程序员的详细消息已被删除。
这是Xcode问题吗? clang / 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将如何格式化断言消息。
更新:发现问题。我原来的描述错了:
在调试器
中运行时,消息 not 正在输出到控制台答案 0 :(得分:3)
两个观察结果:
NSAssert
仅用于调试目的。当您构建应用的发布版本时,NSAssert
不执行任何操作。
当您在设备上运行的应用程序的调试版本中使用NSAssert
时(而不是通过调试器),该消息位于设备的控制台中,而不是Xcode的。如果您转到Xcode中的“管理器”,选择“设备”,选择您的设备并查看“控制台”,您将在那里看到您的断言。
例如,我在“断言测试”应用程序中添加了一行代码:
NSAssert(FALSE, @"Assertion performed here");
当我通过Xcode的管理器查看设备的“控制台”时,我看到:
Aug 6 09:10:53 Rob-iPod amfid[200] : Aug 6 09:10:53 SecTrustEvaluate [leaf CriticalExtensions IssuerCommonName] Aug 6 09:10:53 Rob-iPod Assertion Test[199] : *** Assertion failure in -[ViewController viewDidLoad], /Users/rryan/Documents/Development/Xcode/Assertion Test/Assertion Test/ViewController.m:21 Aug 6 09:10:53 Rob-iPod kernel[0] : launchd[199] Builtin profile: container (sandbox) Aug 6 09:10:53 Rob-iPod kernel[0] : launchd[199] Container: /private/var/mobile/Applications/7A7A62EF-8CEC-4388-932D-5C02DE77B841 (sandbox) Aug 6 09:10:53 Rob-iPod Assertion Test[199] : *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Assertion performed here' *** First throw call stack: (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) Aug 6 09:10:54 Rob-iPod ReportCrash[201] : Formulating crash report for process Assertion Test[199] Aug 6 09:10:54 Rob-iPod com.apple.launchd[1] (UIKitApplication:com.robertmryan.Assertion-Test[0x7be0][199]) : (UIKitApplication:com.robertmryan.Assertion-Test[0x7be0]) Job appears to have crashed: Abort trap: 6 Aug 6 09:10:54 Rob-iPod backboardd[26] : Application 'UIKitApplication:com.robertmryan.Assertion-Test[0x7be0]' exited abnormally with signal 6: Abort trap: 6 Aug 6 09:10:54 Rob-iPod ReportCrash[201] : libMobileGestalt copySystemVersionDictionaryValue: Could not lookup ReleaseType from system version dictionary Aug 6 09:10:54 Rob-iPod ReportCrash[201] : Saved crashreport to /var/mobile/Library/Logs/CrashReporter/Assertion Test_2013-08-06-091053_Rob-iPod.plist using uid: 0 gid: 0, synthetic_euid: 501 egid: 0
如果你看第五行,你会在那里看到断言信息。
答案 1 :(得分:0)
这是特定情况......我没有意识到,但我们在应用程序中嵌入了HockeyApp / QuincyKit。
曲棍球似乎有一个令人讨厌的错误:
所以...消息在调试器中可见,但只在调试器变量中 - 我是个傻瓜,没注意:它们没有出现在控制台中。
要明确:有些断言有时出现在曲棍球(看着曲棍球控制台),但大多数断言都默默无声。出现100%的应用程序崩溃,但只有大约10%的断言崩溃。