Xcode中的堆栈跟踪有什么意义?

时间:2014-03-31 02:49:59

标签: ios objective-c xcode debugging

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

我想知道是否有任何方法可以使用此Stack Trace,或者我是否可以将跟踪向前移动到“真正的”问题,或者从中提取人类可用的描述。

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

3 个答案:

答案 0 :(得分:2)

实际上它确实停在"真实"问题并暂停执行以存储当前的操作状态。即使作为一名低年级学生,我也多次使用它。

以下是一个例子:

#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开始执行。当它崩溃时,暂停执行状态可以很容易地看出错误。

如果您需要,可以通过单击左上角的停止按钮

退出程序

答案 1 :(得分:1)

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

我从来没有能够继续,所以我的策略是尝试理解为什么我们在更全面的意义上崩溃(例如,查看其他线程正在做什么)然后解决这个问题。

答案 2 :(得分:0)

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

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

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

堆栈跟踪将开始变得更有意义但你可能永远不会理解所有这些,除非你做了很多并且在编译器上工作。