获取任意线程调用栈

NSThread 有一个类方法 callstackSymbols 可以获取当前线程的调用栈。但不能获取到所有线程的调用栈

系统提供了task_threads 方法,可以获取到所有的线程,注意这个获取的线程是最底层的mach线程

对于每个线程,可以用thread_get_state方法获取它的信息,信息填充在_STRUCT_MCONTEXT 类型的参数中。

在_STRUCT_MCONTEXT类型的结构体中,存储了当前线程的Stack Pointer 和最顶部栈帧的Frame Pointer,从而获取到了整个线程的调用栈。

在项目中,调用栈存储在backtraceBuffer 数组中,其中每一个指针对应了一个栈帧,每个栈帧对应一个函数调用,并且每个函数都有自己的符号名。

接下来根据栈帧的Frame Pointer 获取到这个函数调用的符号名。

符号解析:
1、根据Frame Pointer 找到函数调用的地址
2、找到Frame Pointer 属于哪个镜像文件
3、找到镜像文件的符号表
4、在符号表中找到函数调用地址对应的符号名

参考链接

你可能感兴趣的:(获取任意线程调用栈)