【问题标题】:What is the point of a Stack Trace in Xcode?Xcode 中的堆栈跟踪有什么意义?
【发布时间】:2014-04-01 01:23:20
【问题描述】:

有时 Xcode 会遇到错误 - 但不是抛出正确的“程序结束”并给我一个描述,我得到的只是一个“暂停”视图,就像我设置了一个断点一样。我所看到的只是一个巨大的堆栈跟踪,我可以按几百万次“执行程序”功能,一次将跟踪向前移动一行。它所做的只是让我感到沮丧并磨损我的触控板。

我想知道是否有任何方法可以利用此堆栈跟踪,或者我是否可以将跟踪移至“真正的”问题,或者从中提取人类可用的描述。

有时异常断点有助于防止堆栈跟踪,但通常我觉得调试器让我失望了。还是我遗漏了什么,堆栈跟踪实际上是否包含我可以用来显示问题的信息?

【问题讨论】:

  • 重点是尝试告诉您出了什么问题。不幸的是,在像 iOS 这样的多线程环境中,从堆栈跟踪中并不总是很明显哪个线程以及哪个代码有错误。尝试从断点检查器设置“异常断点”。您还应该在输出控制台窗口中收到一条消息,为您提供一些关于出现问题的线索。这是一个教程 - raywenderlich.com/28289/debugging-ios-apps-in-xcode-4-5
  • 是的,我喜欢他的异常断点,它们有时很有帮助。感谢您的链接!
  • @Paulw11 坦率地说,这条评论比“答案”更有用。

标签: ios objective-c xcode debugging


【解决方案1】:

实际上它确实停止在“真正的”问题上并暂停执行以存储当前的操作状态。即使是一个低年级的本科生,我也用过很多次。

这是一个例子:

#include <iostream>

int main(){
    std::cout<<"This is not what you should do"<<std::endl;
    int sum = 0;
    int target = 6;
    for(int i = target; i>=0;--i){
        sum += 1/i;
    }
    std::cout<<"we never see this but still it should give us a partial sum of the harmanic sequence "<<sum<<std::endl;
}

这会将 1/n 的总和从 1 输出到目标,但它会尝试从 0 开始执行此操作。当它崩溃时,执行的暂停状态可以很容易地看出哪里出了问题。

如果你愿意,你可以随时点击左上角的停止按钮退出程序

【讨论】:

    【解决方案2】:

    堆栈跟踪向您显示崩溃发生的位置(您停止的点)。这并不总是在您的代码中,因此您可以查看堆栈跟踪到您的代码实际调用的位置,如果幸运的话,您可以检查函数和局部变量的参数值,这有望为您提供足够的上下文了解崩溃发生的原因。

    我一直无法继续,所以我的策略是尝试从更全局的角度理解我们崩溃的原因(例如查看其他线程在做什么)然后解决这个问题。

    【讨论】:

      【解决方案3】:

      堆栈跟踪试图告诉您哪里出了问题。 它不容易阅读,尤其是当它在应用程序 main 上中断时。 学习如何使用调试工具是一门艺术,这就是其中之一。 一个起点是文档。 在 Apple 的开发人员网站上有一些较旧但大部分仍然相关的文章,关于阅读堆栈跟踪和使用调试工具。 还有一些关于该主题的精彩 WWDC 视频,非常值得您花时间。

      一般来说,如果您迷路了,请留意它何时发生。 这为您提供了更多线索。 线索在哪里放置断点。 断点可帮助您隔离一段已编译但实际上不起作用的代码。 然后,您可以单步执行断点,直到出现大的错误堆栈跟踪。这通常会有所帮助。 您还可以使用“穴居人调试”并开始使用 NSLog 调用来帮助您的代码以类似的方式进行隔离。

      除此之外,您还会想要那些 WWDC 视频。 您会发现许多您希望不经常需要的可用技术工具。

      堆栈跟踪将开始变得更有意义,但您可能永远无法理解所有内容,除非您经常这样做并使用编译器。

      【讨论】:

      • 不幸的是,它们可能都是时间敏感的。 Xcode 的每个版本都有重大变化。期望开发人员访问 Apple Developer 站点并查找和查看 Xcode 文档和视频是非常合理的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 2011-01-06
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多