/ / jak wywołać backtrace_symbols () w swift - swift, swift3

jak wywołać backtrace_symbols () w swift - swift, swift3

w celu c mogę wywołać kod, aby uzyskać ślad void* callstack[128]; int frames = backtrace(callstack, 128); char **strs = backtrace_symbols(callstack, frames); przez import #include <execinfo.h>

ale szybko mogę zadzwonić backtrace i backtrace_symbols, Nie mogę znaleźć execinfozłożyć dowolne miejsce

Odpowiedzi:

4 dla odpowiedzi № 1

W Swift 3 możesz po prostu wydrukować ślad stosu (od Jak wydrukować stos połączeń w Swift?):

for symbol in Thread.callStackSymbols {
print(symbol)
}

Ale jeśli jesteś ciekawy, jak przetłumaczyć kod C na Swift: Najpierw dodaj

#include <execinfo.h>

do mostkowego pliku nagłówkowego, aby utworzyć backtrace() funkcjonować dostępny. Następnie zauważ to void * koresponduje z UnsafeMutableRawPointer? w Swift i prawie gotowe:

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)
}