第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開發(fā)者教程

Android Studio 編輯器教程

Android Studio 如何分析堆棧軌跡

前面的小節(jié)我們介紹了添加日志和查看日志,從本小節(jié)我們學(xué)習(xí)如何分析堆棧信息。

1. 應(yīng)用崩潰堆棧

在應(yīng)用調(diào)試過程中,當(dāng)碰到應(yīng)用崩潰時,最有效的分析方式是能獲取到崩潰堆棧信息,通過分析堆棧信息我們可以還原現(xiàn)場函數(shù)調(diào)用情況,定位到崩潰的代碼行。

我們特意寫一段崩潰代碼,然后查看下崩潰堆棧是怎樣的,代碼如下:

package com.imooc.firstapp;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        int num = 1 / 0;
    }
}

編譯運行。APP 在啟動時崩潰了,從 Logcat 中看到的崩潰堆棧信息如下:

關(guān)鍵部分如下:

Caused by: java.lang.ArithmeticException: divide by zero
    at com.imooc.firstapp.MainActivity.onCreate(MainActivity.java:12)
    at android.app.Activity.performCreate(Activity.java:7802)
    at android.app.Activity.performCreate(Activity.java:7791)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)

從崩潰堆棧中我們可以清楚的看到是 MainActivity.java 第 12 行的 onCreate 方法中發(fā)生了崩潰,崩潰原因是 divide by zero (除數(shù)為0)。

2. 添加堆棧輸出

當(dāng)我們的應(yīng)用因為錯誤或異常而崩潰時會自動輸出堆棧信息外,我們還可以使用 Thread.dumpStack() 等方法輸出應(yīng)用代碼中任意位置的堆棧軌跡。在我們分析具體業(yè)務(wù)流程時這種方法將非常有效。

我們創(chuàng)建一段代碼,看下效果如何:

package com.imooc.firstapp;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myCall();
    }

    private void myCall() {
        Log.d("test", "myCall");
        Thread.dumpStack();
    }
}

編譯運行。APP 啟動時 Logcat 中的輸出信息如下:

關(guān)鍵部分如下:

2020-06-15 16:32:56.023 15079-15079/? D/test: myCall
2020-06-15 16:32:56.023 15079-15079/? W/System.err: java.lang.Exception: Stack trace
2020-06-15 16:32:56.024 15079-15079/? W/System.err:     at java.lang.Thread.dumpStack(Thread.java:1513)
2020-06-15 16:32:56.024 15079-15079/? W/System.err:     at com.imooc.firstapp.MainActivity.myCall(MainActivity.java:18)
2020-06-15 16:32:56.024 15079-15079/? W/System.err:     at com.imooc.firstapp.MainActivity.onCreate(MainActivity.java:13)
2020-06-15 16:32:56.024 15079-15079/? W/System.err:     at android.app.Activity.performCreate(Activity.java:7802)
2020-06-15 16:32:56.024 15079-15079/? W/System.err:     at android.app.Activity.performCreate(Activity.java:7791)

從堆棧中我們可以清楚的看到是 MainActivity.java 第13行的 onCreate 方法中調(diào)用了 myCall 方法。

3. 外部來源的堆棧

有時我們需要分析錯誤報告中與我們分享的堆棧軌跡,而不是我們在調(diào)試時發(fā)現(xiàn)的堆棧軌跡。例如,我們可能正在通過 Google Play 管理中心或一些其他工具(例如 Firebase 崩潰報告)收集用戶設(shè)備上生成的堆棧軌跡。

對于來自錯誤報告的外部堆棧軌跡,要獲取相同的突出顯示且可點擊的視圖,請按照以下步驟操作:

  1. 在 Android Studio 中打開我們的項目;

Tips:請確保我們正在查看的源代碼的來源應(yīng)用版本與生成堆棧軌跡的應(yīng)用版本完全相同。如果代碼不同,文件名與行號會不匹配,或堆棧軌跡和我們的項目中的調(diào)用順序會不一致。

  1. Analyze 菜單中,點擊 Analyze Stack Trace;

  2. 將堆棧軌跡文本粘貼到 Analyze Stack Trace 窗口中,然后點擊 OK;

  3. Android Studio 會在 Run 窗口下打開一個新的 Stacktrace 標(biāo)簽頁,其中包含我們粘貼的堆棧軌跡。

4. 小結(jié)

本節(jié)課程我們主要學(xué)習(xí)了如何分析堆棧信息。本節(jié)課程的重點如下:

  • 掌握如何分析崩潰堆棧;
  • 掌握如何在代碼任意位置打印堆棧。