在Android Studio中使用Method trace,查看某进程的全部线程trace的方法

背景


近几天开发的过程当中,遇到了一个很棘手的问题:在没网络状况下OKHttp的任何请求,全都没有任何回应。想要查看线程的调用栈查看是哪里stuck了。


因而使用了AndroidStudio的工具。Monitors中CPU的Method tracing功能。这就是今天写这篇文章的目的。android

clipboard.png
(Android Studio的Method tracing功能)网络

Method tracing有什么做用?


Method tracing的做用就是监听一段时间内,某个进程的某个线程,执行的全部方法,以及各个方法所消耗的时间。而后开发者能够从中找到一些蛛丝马迹来推断出程序中的一些问题。app

如何使用?


  1. 按下“start method tracing”按钮。如图:

    clipboard.png

  2. 对app进行想要监听过程的操做。我这里就是操做异常的网络请求。

  3. 按下“stop method tracing”按钮。如图:

    clipboard.png

  4. 查看生成的trace文件。

    clipboard.png
    (这就是分析出来的method trace文件)less

trace文件怎么分析?


  1. 线程选择。
    clipboard.png
    (主线程)
    线程下拉框拉下来之后出来一堆线程。其中“main”就是主线程。

  2. x时间轴选择。async

    clipboard.png
    (x时间轴)
    关于时间轴的解释,我查了下google:工具

    Wall Clock Time - Total CPU time elapsed between the method call and return.google

    Thread Time - Total time during which the JRE scheduled the thread during call processing. It’s less than or equal to the Wall Clock Time: less if the JRE interrupted the thread, and equal if it didn’t. The thread might not run continuously; when it’s not executing, that time is excluded. If threads are interrupted often and it’s not by design, the interruptions affect app performance. However, an example of a by-design use is synchronous operations that take a long time, such as file transfers and reads from disk, where the method could be the asynchronous wrapper for the synchronous reader.spa

    大体理解一下:
    Wall Clock Time,计算整个CPU时间,一个方法从开始到return,都会计算在内。
    Thread Time,从整个CPU时间,减掉可能由JRE中断线程的时间。线程

    OK这里就选择Wall Clock Time。orm


  3. method图标,重头戏来了,整个trace中最重要的就是这个图标了

    clipboard.png
    (Arrays.copyOf方法的调用详情)


    首先,最显眼的东西就是这个黄色的长条条了,每一个长方形都是一个方法,长度表明这个方法执行的时间(就是上面我们选择的Wall Clock Time啦)。Inclusive Time是指copyOf以及它的子方法调用的时间,占整个线程执行时间的占比。Exclusive Time与Inclusive Time相对,它不统计子方法执行的时间。


    进一步分析,copyOf长方形的的上面的方法是ArrayList.grow方法,下面的长方形是...嗯也是一个copyOf。其实这个上下关系,就正是父子关系。即copyOf是ArrayList.grow的一个子方法。


    那...咱们其实根本不想分析这些很细节的方法,咱们只关心咱们本身写的方法的调用顺序或者调用耗时。那该怎么作呢?


    例如说,我本来的目的实际上是查看被stuck的网络请求。我能够从中获得什么信息?首先,我查看的是本身写的方法,并不是底层的方法,那么我要查看的长方形就在上面。其次,我想查看的是stuck的方法,那么它最终必定没有执行完毕,那么我要查看的长方形必定在最后。


    那么,选中想要的线程,拉到最后:

    clipboard.png
    (最后的横截面)


    这个最后的横截面,就是没有执行完的方法的调用栈。再看最后一个长方形:

    clipboard.png
    (libcore.io.Posix.android_getaddrinfo)

    那么这个线程最终卡在了这一步。至此,我达到了个人目的。


  4. 最后,还有下面的一个表格:

    clipboard.png
    (方法统计表格)
    有四栏数据,分别是:方法名称,方法调用次数,包含子方法的调用时间,不包含子方法的调用时间。


总结一下


其实一开始写这篇文章以前,Method tracing的好多功能我都不知道是什么。想着要记录一下终于使用这个工具达到了个人目的,而后记录下来这个过程。写文章的过程当中,反而发现不少东西都不懂,这就须要去查资料。结果就真的查出了好多恍然大悟的知识点。每次写完一篇文章都收获很大,要告诉本身记住这样的感受,之后有所收获必定要不怕麻烦,把它换成文字,一来记录本身的所得,二来能够梳理这些知识点,甚至有时候能够获得写文章之前不知道的东西。

相关文章
相关标签/搜索