美文网首页
获取任意线程调用栈

获取任意线程调用栈

作者: TaoGeNet | 来源:发表于2020-02-16 18:04 被阅读0次

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、在符号表中找到函数调用地址对应的符号名

参考链接

相关文章

  • iOS获取任意线程调用栈

    iOS获取任意线程调用栈iOS获取任意线程调用栈

  • iOS 野指crash定位

    PLCrashReporterPLCrashReporter 源码分析获取任意线程调用栈的那些事Scribble&...

  • 获取任意线程调用栈

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

  • iOS获取任意线程调用栈

    最近在写一些东西需要获取任意线程调用栈,然后看了现有的一些开源框架,写的比较复杂而且对Swift的支持不是很好,所...

  • 通过Signal handling(信号处理)获取任意线程调用栈

    获取任意线程调用栈目前有两种方式。第一方式拿到栈的指针(StackPointer)以及栈帧指针(FramePoin...

  • 线程、函数的调用地址

    线程的调用就会有函数的调用,就会把调用地址压入栈中,所以就可以从栈中获取调用地址。 通过[NSThread cal...

  • 打印函数调用堆栈

    相关函数签名 backtrace():栈回溯,保存各个栈帧的地址。该函数用于获取当前线程的函数调用堆栈,获取的信息...

  • Android性能分析维度简要

    CPU top命令查看进程CPU使用情况 cat /proc/cpuinfo 获取线程调用栈kill -3 指定的...

  • iOS获取任意线程调用堆栈信息

    场景需求 线上app运行过程中有内存突变、卡顿、cpu飙升、crash等情况,需要获取发生这些情况时的所有堆栈信息...

  • ANR分析

    ANR日志分析 获取日志 trace文件解析 trace文件例子 关注主线程调用栈,断点调试若干次就可搞定了。 基...

网友评论

      本文标题:获取任意线程调用栈

      本文链接:https://www.haomeiwen.com/subject/dkhmfhtx.html