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źć execinfo
złożyć dowolne miejsce
Odpowiedzi:
4 dla odpowiedzi № 1W 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)
}