web-dev-qa-db-ja.com

Swiftでコールスタックを印刷する方法は?

Objective-Cでは、次を実行してコールスタックを印刷できます。

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

Foundationクラスを使用せずにSwiftでこれを行うにはどうすればよいですか?

43
Boon

ジェイコブソンが言うように、次を使用します。

スイフト2:

print(NSThread.callStackSymbols())

Swift 3/Swift 4:

print(Thread.callStackSymbols)

これはSwiftコードです。Foundationメソッドを使用していますが、iOSで行っていることの90%以上を使用しています。

編集:

以下を使用する場合、フォーマットがより良く見えることに注意してください。

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

デバッガーのコマンドラインから次のように入力できます。

e Thread.callStackSymbols.forEach{print($0)}
70
Duncan C

Swift 3を使用:

print(Thread.callStackSymbols)

またはより良いフォーマットのために

for symbol: String in Thread.callStackSymbols {
    print(symbol)
}
10
Doug Amos

これにより、出力が少し改善されます。

for symbol: String in NSThread.callStackSymbols() {
    NSLog("%@", symbol)
}
5
Kevin Snow

Githubで見つけた素晴らしいユーティリティクラスを次に示します。

https://github.com/nurun/swiftcallstacktrace

任意のスタックトレースシンボルのタプル(クラス、メソッド)を取得するので、きれいに印刷できます。

CallStackAnalyser.classAndMethodForStackSymbol(NSThread.callStackSymbols()[2])
2
Mike S

コールスタックをログファイルに書き込む必要があるため、そのように調整しました。

var ErrorStack = String()
Thread.callStackSymbols.forEach {
    print($0)
    ErrorStack = "\(ErrorStack)\n" + $0
}
0
Breathable