在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的好多功能我都不知道是什麼。想着要記錄一下終於使用這個工具達到了個人目的,而後記錄下來這個過程。寫文章的過程當中,反而發現不少東西都不懂,這就須要去查資料。結果就真的查出了好多恍然大悟的知識點。每次寫完一篇文章都收穫很大,要告訴本身記住這樣的感受,之後有所收穫必定要不怕麻煩,把它換成文字,一來記錄本身的所得,二來能夠梳理這些知識點,甚至有時候能夠獲得寫文章之前不知道的東西。

相關文章
相關標籤/搜索