如何在Swift中打印调用堆栈?

Boo*_*oon 46 debugging callstack swift

在Objective-C中,您可以通过执行以下操作来打印调用堆栈:

NSLog(@"%@", [NSThread callStackSymbols]);
Run Code Online (Sandbox Code Playgroud)

如何在不使用Foundation类的情况下在Swift中执行此操作?

Dun*_*n C 76

正如雅各布森所说,使用以下内容:

斯威夫特2:

print(NSThread.callStackSymbols())
Run Code Online (Sandbox Code Playgroud)

Swift 3/Swift 4:

print(Thread.callStackSymbols)
Run Code Online (Sandbox Code Playgroud)

这是Swift代码.它使用的是基金会方法,但你在iOS上做的比例是90%.

编辑:

请注意,如果您使用以下格式看起来更好:

Thread.callStackSymbols.forEach{print($0)}
Run Code Online (Sandbox Code Playgroud)

从调试器命令行,您可以键入

e Thread.callStackSymbols.forEach{print($0)}
Run Code Online (Sandbox Code Playgroud)


Dou*_*mos 10

对于Swift 3使用:

print(Thread.callStackSymbols)
Run Code Online (Sandbox Code Playgroud)

或者为了更好的格式

for symbol: String in Thread.callStackSymbols {
    print(symbol)
}
Run Code Online (Sandbox Code Playgroud)

  • 甚至更快的3:`Thread.callStackSymbols.forEach {print($ 0)}` (7认同)

Vla*_*vík 7

 print(Thread.callStackSymbols.joined(separator: "\n"))
Run Code Online (Sandbox Code Playgroud)

通过这段代码,人们可以看到每一行不同行中的调用。

 1   MyApp                               0x0000000100720780 $s9MyAppModule....
 2   CoreFoundation                      0x0000000181f04c4c EA9C1DF2-94C7-379B-BF8D-970335B1552F + 166988
 3   CoreFoundation                      0x0000000181f99554 EA9C1DF2-94C7-379B-BF8D-970335B1552F + 775508
 4   CoreFoundation                      0x0000000181f6eb34 EA9C1DF2-94C7-379B-BF8D-970335B1552F + 600884
 5   CoreFoundation                      0x0000000181f19754 _CFXNotificationPost + 696
 6   Foundation                          0x0000000183634138 86D8A58D-B71F-34C6-83E0-014B2B835F1D + 106808
Run Code Online (Sandbox Code Playgroud)


小智 5

这稍微改善了输出.

for symbol: String in NSThread.callStackSymbols() {
    NSLog("%@", symbol)
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么不在 for 循环中使用 Swift 的 `print` 来显示每一行而不是 `NSLog`?`NSLog` 相当“嘈杂”(每一行都以时间戳、有关进程和线程的信息等开头) (2认同)