Xcode完整的堆栈跟踪

93
在调试过程中,有没有办法在命令窗口上看到完整的堆栈跟踪(即主线程中调用的方法列表)?

在编程中,你可以像Mihir所描述的那样使用callStackSymbols。当然,你也可以在Xcode中停止在断点处(或者只是按下“暂停”按钮),并检查左侧列中的堆栈。(始终启用异常断点。) - Hot Licks
2
(+1 表示意识到检查堆栈的重要性。在开始使用 Xcode 的时候,很少有人会欣赏这一点。) - Hot Licks
我正在做同样的事情,但在堆栈跟踪中,我只能看到5或6个方法调用,之后是UIApplicationMain在第25个位置和main在第26个位置。我无法看到第6到25个方法。我想要看到完整的堆栈跟踪。 - NaXir
1
我通过nslog得到了它。谢谢大家。 - NaXir
5个回答

166

在(lldb)中使用bt命令。

一旦暂停或崩溃后,只需在调试控制台中键入bt即可。
它会打印完整的堆栈跟踪。

bt命令的示例输出


在设置符号断点后,追踪约束问题的绝佳技巧。 - Alex Walczak
1
您也可以提及线程ID(来自调试窗口),以捕获特定线程的堆栈。例如,在 42 线程的情况下,您将执行 -“bt 42”。 - rivaldo4t
请耐心等待,它需要大约30秒才能打印出来。 - abc123

88

你可以通过在NSLog中打印堆栈跟踪来进行调试。


NSLog(@"Stack trace : %@",[NSThread callStackSymbols]);

当程序崩溃时,在单词(lldb)旁边,你可以输入:

po [NSThread callStackSymbols]

编辑:

为了在Swift控制台上获得更好的输出结果,您可以改用以下代码行:

Thread.callStackSymbols.forEach{print($0)}

11
lldb内可通过以下方式打印:po [NSThread callStackSymbols]。 - Max MacLeod
更新了答案。 - Mihir Mehta
po Thread.callStackSymbols 返回 无法在类型上使用点运算符 - pho_pho

72
在Xcode 6中,您可以单击显示完整堆栈跟踪的面板左下角的按钮。 Xcode 6显示完整堆栈跟踪

1
这个答案在Xcode 11中仍然适用,但按钮略微移动了一下。 ;) - ReinstateMonica3167040

17
在Xcode 5中,您可以移动底部面板上的滑块,该面板显示堆栈跟踪。它控制显示多少堆栈跟踪。 控制堆栈跟踪的滑块

6
在Xcode 6中如何操作?现在没有滑块了。 - progrmr
3
这个滑块似乎在XCode6中被移除了... 如果有人知道如何在XCode6下完成这个操作,你就是我的英雄。 - Steazy
@Steazy 请参考龚鹏钧的答案,适用于Xcode 6-11(或可能更高版本,当前为11.x)。 - ReinstateMonica3167040

4
你可以在异常抛出之前添加断点。首先进入“断点导航器”(cmd + 6)。在左下角单击加号按钮。或者,您可以使用“Instruments”(/Developer/Applications/Instruments)来帮助检测“僵尸”对象的使用。参考资料 当您添加断点时,Xcode将创建图片进行审查。

enter image description here

您可以使用底部的滑块来扩展堆栈跟踪,使用step overover进行逐行日志记录。
谢谢,希望这能帮到您。

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