NSAssert在调试器中工作,但直接在设备上运行时控制台中缺少该消息

时间:2013-08-06 12:52:19

标签: ios objective-c xcode llvm

运行调试器时,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 正在输出到控制台

2 个答案:

答案 0 :(得分:3)

两个观察结果:

  1. NSAssert仅用于调试目的。当您构建应用的发布版本时,NSAssert不执行任何操作。

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

  3. 例如,我在“断言测试”应用程序中添加了一行代码:

    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。

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

  1. 捕获NSAssertions
  2. 允许他们崩溃
  3. 删除邮件
  4. 删除记录
  5. ... 将任何内容上传到曲棍球网站
  6. 所以...消息在调试器中可见,但只在调试器变量中 - 我是个傻瓜,没注意:它们没有出现在控制台中。


    要明确:有些断言有时出现在曲棍球(看着曲棍球控制台),但大多数断言都默默无声。出现100%的应用程序崩溃,但只有大约10%的断言崩溃。