App 方法耗时检查工具

实现思路

  • 定时抓取主线程上的方法调用堆栈,计算一段时间里各个方法的耗时

定时器设计

D4211C5F-44CF-42D8-81B6-5CE97220ADF9.png

获取方法调用堆栈

callstackSymbols 是一种获取方法调用栈的方法,但是只能获取当前线程的调用栈,为了把对主线程的影响降到最小,获取当前线程调用栈的工作就需要在其他线程去做。所以,这个解题思路就需要换成:使用系统提供的 task_threads 去获取所有线程,使用 thread_info 得到各个线程的详细信息,使用 thread_get_state 方法去获取线程栈里的所有栈指针

如果接下来立刻进行符号化去获取方法名,那么就需要去 __LINKEDIT segment 里查找栈指针地址所对应符号表的符号,特别当你设置的时间隔较小的时候,符号化过程会持续消耗较多的 CPU 资源,从而影响主线程。

所以,获取到栈指针后,我们可以不用立刻做符号化,而是先使用一个结构体将栈地址记录下来,最后再统一符号化,将对主线程的影响降到最低,这样获取的数据也会更加准确。

设计记录栈地址的结构体

C728D3BE-925F-4816-855A-845E22A5C1A0.png

previous 记录的是上一个栈指针的地址

top