在Xcode中,堆栈跟踪的作用是什么?

3
有时Xcode会出现错误,但它并没有像抛出一个正常的“程序结束”的描述那样,而是给我展示了一个“暂停”视图,就像我设置了一个断点一样。我只能看到一个巨大的堆栈跟踪,而且我可以按下“执行程序”功能数百万次,每次一行地向前移动跟踪。这只会让我感到沮丧,并使我的触控板磨损。
我想知道是否有办法利用这个堆栈跟踪,或者如果我可以将跟踪向前移动到“真正”的问题上,或者从中提取出可供人类使用的描述。
有时异常断点有助于防止堆栈跟踪,但通常情况下,我觉得调试器让我失望了。难道我错过了什么,堆栈跟踪实际上包含了我可以用来显示问题的信息吗?

2
重点是尝试向您展示出了什么问题。 不幸的是,在像iOS这样的多线程环境中,从堆栈跟踪中并不总是明显可以看出哪个线程以及具体哪些代码出现了错误。 尝试从断点检查器中设置“异常断点”。 您还应该在输出控制台窗口中收到一条消息,以便为您提供某些有关出错原因的线索。 这里是一个教程- http://www.raywenderlich.com/28289/debugging-ios-apps-in-xcode-4-5 - Paulw11
是的,我喜欢异常断点,有时它们很有帮助。谢谢你提供的链接! - Jay Versluis
@Paulw11 这个评论比"答案"实际上更有用。 - meelash
3个回答

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加到目标数所需的1/n总和,但它试图从0开始执行。当它崩溃时,暂停执行状态使得很容易发现问题所在。
如果需要的话,您可以随时通过点击左上角的停止按钮来退出程序。

1
堆栈跟踪显示了崩溃发生的位置(您停止的点)。这并不总是在您的代码中,因此您可以向下查看堆栈跟踪以查找实际调用您代码的位置。如果幸运的话,您可以检查函数参数和局部变量的值,这将有助于了解为什么会发生崩溃。

我从未能够继续执行,所以我的策略是尝试以更全局的方式理解为什么会崩溃(例如查看其他线程正在做什么),然后修复该问题。


1
堆栈跟踪试图告诉你哪里出了问题。它不容易阅读,特别是当应用程序主函数出现错误时。学习如何使用调试工具需要一定的技巧,其中之一就是从文档开始。在苹果开发者网站上有一些较旧但仍然相关的文章,介绍如何阅读堆栈跟踪和使用调试工具。此外,还有一些非常值得花时间观看的WWDC(苹果全球开发者大会)视频。
通常来说,如果你迷失了方向,可以考虑它发生的时间,这会给你更多线索。线索可以帮助你设置断点,断点可以帮助你隔离编译但实际上无法工作的代码段。然后你可以逐步执行断点,直到出现堆栈跟踪。这通常会有所帮助。你还可以使用“穴居人式调试”,在代码中添加 NSLog 调用,以类似的方式进行隔离。
除此之外,你还需要观看那些 WWDC 视频。你会发现许多技术工具可用,希望你不需要经常使用。
堆栈跟踪会变得更加清晰,但除非你经常这样做并且从事编译器工作,否则你可能永远无法完全理解它。

不幸的是,它们可能都是时间敏感的。每个Xcode版本都有重大变化。合理地期望开发人员前往苹果开发者网站查找并查看Xcode文档和视频。 - uchuugaka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接