【问题标题】:Why does NSAssert break in main instead of in the code that call the assertion为什么 NSAssert 在 main 而不是在调用断言的代码中中断
【发布时间】:2012-06-01 05:10:19
【问题描述】:

我设置了这个 NSAssert

NSAssert(isStillLoadingArgument== [[self class] stillLoading],@"Hmm.... we think isStill Loading is false or true and yet stillLoading is true");;

这是我提出这个问题的屏幕截图:

那么当断言失败时,代码在这里中断:

这很烦人,因为我想在我设置断言的代码上看到断言中断。那么,我该怎么做呢。

不幸的是,Ben 的回答并没有解决问题:

【问题讨论】:

  • 本的回答确实解决了这个问题。在第二张图片中,调试器已停止在断言处,它只是与您的断言不同。
  • 第二张图片?没有调试器在 main 处停止。如果您查看我的上一个屏幕截图,我会告诉您断言在哪里。调试器(绿色箭头)在 main 上。
  • 底部图片。 i.stack.imgur.com/fyIZI.jpg 代码窗口和控制台输出都表明它停止的断言与您的断言不同。

标签: objective-c xcode nsassert


【解决方案1】:

你需要为你的项目添加一个断点来处理所有的异常。

1) 点击断点导航器

2) 添加异常断点

3) 确保将其设置为在所有异常情况下中断

现在 XCode 将中断到实际的断言而不是 main。希望这会有所帮助!

【讨论】:

  • 好答案,漂亮的图片:)
  • 我试过它仍然在 main 上中断。那么我们为什么要在 Throw 上休息呢?此外,评估后选项会自动继续执行什么操作?
  • 您可以添加要在断点被命中时执行的操作。当您只希望断点记录某些内容然后继续而不实际停止时很方便。至于 on throw,您希望在抛出异常后立即中断。奇怪的是,这对您不起作用,也许您的断言正在触发,而您实际上看不到苹果类中的断言。
  • @JimThio 你不知道 Ben 的回答很完美吗?调试器在 NSAssert 上正确中断,但它与您的断言不同。
  • 绿点位于 main 处。有时 NSAssert 在它的位置中断。大多数时候它会在 main 处中断。
【解决方案2】:

配置调试器以中断异常。

当一个断言失败时,它会引发一个异常。如果没有捕获到异常,它会在展开堆栈后终止程序,将其留在main()

【讨论】:

  • 包括捕获的异常?我不希望程序因捕获的异常而中断。
  • 我从不使用 try catch 只是想确定一下。
  • 是的,异常断点将在将被捕获的异常处停止。当然,断点只有在调试时才有效。我们不是在谈论改变程序的行为。您只需单击“继续”按钮即可让程序继续。此外,在 Cocoa 中,异常应该只用于您应该在开发期间修复的程序错误,因此即使异常被捕获,您也应该停止处理。
  • 没关系。我想停止异常。我想在异常点停止这种情况。不在主目录。
猜你喜欢
  • 2013-12-13
  • 1970-01-01
  • 2014-10-06
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多