如何在 Swift 中调用 backtrace_symbols()

Sub*_*cle 1 backtrace swift

在Objective-C中,我可以调用代码来获取回溯

void* callstack[128];
int frames = backtrace(callstack, 128);
char **strs = backtrace_symbols(callstack, frames);
Run Code Online (Sandbox Code Playgroud)

按进口 #include <execinfo.h>

但是在 Swift 中,我如何调用backtraceand backtrace_symbols,我在execinfo任何地方都找不到文件。

Mar*_*n R 5

在 Swift 3 中,您可以简单地打印堆栈回溯(来自How to print call stack in Swift?):

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

但是如果你对如何将 C 代码翻译成 Swift 感到好奇:首先添加

#include <execinfo.h>
Run Code Online (Sandbox Code Playgroud)

到桥接头文件以使该backtrace()函数可用。然后注意void *对应 UnsafeMutableRawPointer?于 Swift 中,你就差不多完成了:

var callstack = [UnsafeMutableRawPointer?](repeating: nil, count: 128)
let frames = backtrace(&callstack, Int32(callstack.count))
if let symbols = backtrace_symbols(&callstack, frames) {
    for frame in 0..<Int(frames) where symbols[frame] != nil {
        let symbol = String(cString: symbols[frame]!)
        print(symbol)
    }
    free(symbols)
}
Run Code Online (Sandbox Code Playgroud)