【问题标题】:How to call backtrace_symbols() in Swift如何在 Swift 中调用 backtrace_symbols()
【发布时间】:2017-04-09 15:38:07
【问题描述】:

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

void* callstack[128];
int frames = backtrace(callstack, 128);
char **strs = backtrace_symbols(callstack, frames);

通过导入#include <execinfo.h>

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

【问题讨论】:

    标签: swift backtrace


    【解决方案1】:

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

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

    但如果你好奇如何将 C 代码翻译成 Swift: 先添加

    #include <execinfo.h>
    

    到桥接头文件中,使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)
    }
    

    【讨论】:

      【解决方案2】:
      
      @_silgen_name("backtrace")
      internal func swift_backtrace(_ callstacks: UnsafeMutableRawPointer, _ counts: Int) -> Int
      
      @_silgen_name("backtrace_symbols")
      internal func swift_backtrace_symbols(_ callstacks: UnsafeRawPointer, _ counts: Int) -> UnsafeMutablePointer<UnsafePointer<CChar>>?
      
      
      var callstack = [UnsafeMutableRawPointer?](repeating: nil, count: 128)
      let frames = swift_backtrace(&callstack, callstack.count)
      
      if let symbols = swift_backtrace_symbols(&callstack, frames) {
          for frame in 0..<frames {
              let symbol = String(cString: symbols[frame])
              print(symbol)
          }
          
          free(symbols)
      }
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 2012-10-29
        • 2014-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多