有时Xcode会遇到错误 - 但不是抛出一个正确的“程序结束”并给我一个描述,我得到的只是一个“暂停”视图,就像我设置了断点一样。我所看到的只是一个巨大的堆栈跟踪,我可以按下“执行程序”功能数百万次,一次一行地向前移动跟踪。它所做的一切都让我感到沮丧并且磨损了我的履带板。
我想知道是否有任何方法可以使用此Stack Trace,或者我是否可以将跟踪向前移动到“真正的”问题,或者从中提取人类可用的描述。
有时异常断点有助于防止堆栈跟踪,但通常我觉得调试器让我失望。或者我错过了什么,堆栈跟踪实际上是否包含我可以用来显示问题的信息?
答案 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视频。 你会发现许多技术工具,你希望不经常需要。
堆栈跟踪将开始变得更有意义但你可能永远不会理解所有这些,除非你做了很多并且在编译器上工作。