Android Crash 工具

極力推薦Android 開發大總結文章:歡迎收藏
程序員Android 力薦 ,Android 開發者須要的必備技能node

本篇文章主要介紹 Android 開發中的部分知識點,經過閱讀本篇文章,您將收穫如下內容:linux

1、Crash 簡介
2、搭建Crash 分析kernel ramdump平臺
3、Crash 命令簡介
4、使用 Crash 分析 sysdump log
5、Crash 常規調試程序員

1、Crash 簡介

Linux系統內核發生崩潰的時候,能夠經過 KEXEC+KDUMP 等方式收集內核崩潰以前的內存,生成一個轉儲文件vmcore。內核開發者經過分析該vmcore文件就能夠診斷出內核崩潰的緣由,從而進行操做系統的代碼改進。那麼Crash就是一個被普遍使用的內核崩潰轉儲文件分析工具.sass

對調試來說,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來調試。socket

2、 搭建Crash 分析kernel ramdump平臺

    1. Crash 官方下載源碼

Crash 官網 源碼下載地址函數

    1. 編譯前確保必要的組件(ncurese和zlib),若是沒有須要:
sudo apt-get install libncurses5-dev
sudo apt-get install zlib1g-dev
    1. 編譯 ARM32 / ARM64 位的Crash

1.ARM32工具

cd crash-7.1.0
    make target=ARM

2.ARM64es5

cd crash-7.1.0
    make target=ARM64

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

strip -s crash
  1. 使用對應的vmLinux解析sysdump文件
    當發生kernel crash時,會有db生成,用GAT的logviewer解開db,裏面有SYS_COREDUMP,結合對應的vmlinux(必須是燒錄前備份的vmlinux!)
./crash vmlinux syscoredump(log)

3、Crash 命令簡介

Crash 命令官方簡介
至此,本篇已結束,若有不對的地方,歡迎您的建議與指正。期待您的關注,
感謝您的閱讀,謝謝!

4、使用 Crash 分析 sysdump log

    1. vmlinuxcrash_armsysdump log 放置同一目錄
  • cp out/target/product/sp9832e_1h10_go/obj/KERNEL/vmlinux reboot/
  • cp vendor/sprd/tools/crash/crash_arm reboot/

將 vmlinux crash_arm sysdump log 放置同一目錄

    1. sysdump 全部文件 追加到一個文件中

將sysdump 全部文件 追加到一個文件中

    1. 使用 crash_arm 腳本 聯合 vmlinux 解析 sysdump log

若是解析失敗,能夠參數帶一下參數的命令
32位系統使用以下:
./crash_arm vmlinux all -m phys_base=0x80000000
64位系統使用以下命令:
./crash_arm64 vmlinux all -m phys_offset=0x80000000

使用 crash_arm 腳本 聯合 vmlinux 解析sysdump log

    1. 使用 Log 命令 將 Crash log追加到指定文件中

使用 log 命令 讀取log 到指定文件

    1. 查看log,分析重啓的具體緣由

重啓log舉例

    1. 調高Kernel log Buffer

請將以下兩處修改成=21,增大kernel log buffer後,先抓一份 「進開機嚮導並能正常啓動至idle」 的ylog。

/kernel/sprd-diffconfig/pike2/user_diff_config
VAL:CONFIG_LOG_BUF_SHIFT=16
/kernel/arch/arm/configs/sprd_pike2_defconfig
CONFIG_LOG_BUF_SHIFT=17

5、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 計算表達式的值,及把計算結果或者值顯示爲1六、十、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

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

微信關注公衆號: 程序員Android,領福利

相關文章
相關標籤/搜索