天天看點

crash工具解析_Android Crash 工具

crash工具解析_Android Crash 工具

本篇文章主要介紹

Android

開發中的部分知識點,通過閱讀本篇文章,您将收獲以下内容:

crash工具解析_Android Crash 工具

一、Crash 簡介

Linux

系統核心發生崩潰的時候,可以通過

KEXEC+KDUMP

等方式收集核心崩潰之前的記憶體,生成一個轉儲檔案

vmcore

。核心開發者通過分析該

vmcore

檔案就可以診斷出核心崩潰的原因,進而進行作業系統的代碼改進。那麼

Crash

就是一個被廣泛使用的核心崩潰轉儲檔案分析工具.

對調試來講,

gdb

是非常适合的,但

gdb

始終是調試

native

的工具,不支援

kernel

資訊顯示,比如

task

資訊之類的。

crash

補足了這個短闆,由

Dave Anderson

開發和維護的一個記憶體轉儲分析工具,是基于

GDB

開發的 (

GDB

适用于使用者程序的

coredump

,而

Crash

擴充了

GDB

,使其适用于

linux kernel coredump

),目前它的最新版本是7.2.3。

在沒有統一标準的記憶體轉儲檔案的格式的情況下,Crash工具支援衆多的記憶體轉儲檔案格式,包括:

  • Live linux系統
  • kdump産生的正常的和壓縮的記憶體轉儲檔案
  • 由makedumpfile指令生成的壓縮的記憶體轉儲檔案
  • 由Netdump生成的記憶體轉儲檔案
  • 由Diskdump生成的記憶體轉儲檔案
  • 由Kdump生成的Xen的記憶體轉儲檔案
  • IBM的390/390x的記憶體轉儲檔案
  • LKCD生成的記憶體轉儲檔案
  • Mcore生成的記憶體轉儲檔案

而MTK在KE時會抓取full dump檔案:SYS_COREDUMP,則可以用crash來調試。

二、 搭建Crash 分析kernel ramdump平台

1. Crash 官方 2. 編譯前確定必要的元件(ncurese和zlib),如果沒有需要
crash工具解析_Android Crash 工具
3. 編譯 ARM32 / ARM64 位的Crash

1.ARM32

crash工具解析_Android Crash 工具

2.ARM64

crash工具解析_Android Crash 工具

3.去除編譯生成的Crash 中的多餘符号

crash工具解析_Android Crash 工具

使用對應的vmLinux解析sysdump檔案

當發生kernel crash時,會有db生成,用GAT的logviewer解開db,裡面有SYS_COREDUMP,結合對應的vmlinux(必須是燒錄前備份的vmlinux!)

crash工具解析_Android Crash 工具

三、Crash 指令簡介

Crash(計算機術語)_百度百科​baike.baidu.com

crash工具解析_Android Crash 工具

四、使用 Crash 分析 sysdump log

  • 1. 将 vmlinux crash_arm sysdump log 放置同一目錄
  • cp out/target/product/sp9832e_1h10_go/obj/KERNEL/vmlinux reboot/

  • cp vendor/sprd/tools/crash/crash_arm reboot/

crash工具解析_Android Crash 工具

2. 将

sysdump

所有檔案 追加到一個檔案中

crash工具解析_Android Crash 工具

3. 使用

crash_arm

腳本 聯合

vmlinux

解析

sysdump log

如果解析失敗,可以參數帶一下參數的指令

32位系統使用如下:

./crash_arm vmlinux all -m phys_base=0x80000000

64位系統使用如下指令:

./crash_arm64 vmlinux all -m phys_offset=0x80000000

crash工具解析_Android Crash 工具

4. 使用

Log

指令 将

Crash log

追加到指定檔案中

crash工具解析_Android Crash 工具

5. 檢視

log

,分析重新開機的具體原因

crash工具解析_Android Crash 工具

6. 調高Kernel log Buffer

請将如下兩處修改為=21,增大kernel log buffer後,先抓一份 “進開機向導并能正常啟動至idle” 的ylog。

crash工具解析_Android Crash 工具

五、Crash 正常調試

crash使用gdb作為它的内部引擎,crash中的很多指令和文法都與gdb相同。如果曾經使用過gdb,就會發現crash并不是很陌生。如果想獲得crash更多的指令和相關指令的詳細說明,可以使用crash的内部指令help來擷取:

指令 說明 例子
  • |指針的快捷方式,用于代替struct/union |*page 0xc02943c0:顯示0xc02943c0位址的page結構體

    files | 顯示已打開的所有檔案的資訊 | files 462:顯示程序462的已打開檔案資訊

    mach| 顯示與機器相關的參數資訊 | mach:顯示CPU型号,核數,記憶體大小等

    sys | 顯示特殊系統的資料 s|ys config:顯示CONFIG_xxx配置宏狀态

    timer |無參數。按時間的先後順序顯示定時器隊列的資料 | timer:顯示詳細資訊

    mod| 顯示已加載module的詳細資訊| mod:列出所有已加載module資訊

    runq| 顯示runqueue資訊 | runq:顯示所有runqueue裡的task

    tree |顯示基數樹/紅黑樹結構 | tree -t rbtree -o vmap_area.rb_node vmap_area_root:顯示所有紅黑樹vmap_area.rb_node節點位址

    fuser| 顯示哪些task使用了指定的檔案/socket |fuser /usr/lib/libkfm.so.2.0.0:顯示使用了該檔案的所有程序

    mount| 顯示已挂載的檔案系統資訊 |mount:目前已挂載的檔案系統資訊

    ipcs |顯示System V IPC資訊| ipcs:顯示系統中System V IPC資訊

    ps| 顯示程序狀态 |ps:類似ps指令

    struct| 顯示結構體的具體内容 |struct vm_area_struct c1e44f10:顯示c1e44f10結構

    union| 顯示聯合體的具體内容,用法與struct一緻 |union bdflush_param:顯示bdflush_param結構

    waitq| 列出在等待隊列中的所有task。參數可以指定隊列的名稱、記憶體位址等| waitq buffer_wait:顯示buffer_wait等待隊列資訊

    irq| 顯示中斷編号的所有資訊| irq 18:顯示中斷18的資訊

    list| 顯示連結清單的内容 |list task_struct.p_pptr c169a000:顯示c169a000位址所指task裡p_pptr連結清單

    log| 顯示核心的日志,以時間的先後順序排列 |log -m:顯示kernel log

    dev |顯示資料關聯着的塊裝置配置設定,包括端口使用、記憶體使用及PCI裝置資料 |dev:顯示字元/塊裝置相關資訊

    sig| 顯示一個或者多個task的signal-handling資料 |sig 8970:顯示程序8970的信号處理相關資訊

    task| 顯示指定内容或者程序的task_struct的内容| task -x:顯示目前程序task_struct等内容

    swap| 無參數。顯示已配置好的交換裝置資訊 |swap:交換裝置資訊

    search| 在給定範圍的使用者、核心虛拟記憶體或者實體記憶體搜尋值 |search -u deadbeef:在使用者記憶體搜尋0xdeadbeef

    bt| 顯示調用棧資訊| bt:顯示目前調用棧

    net| 顯示各種網絡相關的資料| net:顯示網絡裝置清單

    vm |顯示task的基本虛拟記憶體資訊 |vm:類似于/proc/self/maps

    btop| 把一個16進制位址轉換成它的分頁号 |N/A

    ptob| 該指令與btop相反,是把一個分頁号轉換成位址 |N/A

    vtop |顯示使用者或核心虛拟記憶體所對應的實體記憶體| N/A

    ptov| 該指令與vtop相反。把實體記憶體轉換成虛拟記憶體 |N/A

    pte |16進制頁表項轉換為實體頁位址和頁的位設定| N/A

    alias |顯示或建立一個指令的别名 |alias kp kmem -p:以後用kp指令相當于kmem -p

    foreach| 用指定的指令枚舉 |foreach bt:顯示所有程序的調用棧

    repeat| 循環執行指定指令 |repeat -1 p jiffies:每個1s執行p jiffies

    ascii |把16進制表示的字元串轉化成ascii表示的字元串 |ascii 62696c2f7273752f:結果為/usr/lib

    set |設定要顯示的内容,内容一般以程序為機關,也可以設定目前crash的内部變量 |set -p:切換到崩潰程序的上下文環境

    p| print的縮寫,列印表達式的值。表達式可以為變量,也可以為結構體 |N/A

    dis |disassemble的縮寫。把一個指令或者函數分解成彙編代碼 |dis sys_signal:反彙編sys_signal函數

    whatis| 搜尋資料或者類型的資訊 |whatis linux_binfmt:顯示linux_binfmt結構體

    eval |計算表達式的值,及把計算結果或者值顯示為16、10、8和2進制| N/A

    kmem| 顯示目前kernel使用記憶體狀況 |kmem -i:顯示kernel使用記憶體狀況

    sym| 顯示符号所在的虛拟位址,或虛拟位址對應的符号| sym jiffies:顯示jiffies位址

    rd |顯示指定記憶體的内容。缺少的輸出格式是十六進制輸出| rd -a linux_banner:顯示linux_banner内容

    wr| 根據參數指定的寫記憶體。在定位系統出錯的地方時,一般不使用該指令 wr |my_debug_flag 1:修改my_debug_flag值為1

    gdb| 執行GDB原生指令 |gdb help:執行gdb的help指令

    extend| 動态裝載或解除安裝crash額外的動态連結庫 |N/A

    q |退出|N/A

    exit |同q,退出| N/A

    help |幫助指令 |N/A

至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!