
本篇文章主要介紹
Android
開發中的部分知識點,通過閱讀本篇文章,您将收獲以下内容:
一、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),如果沒有需要1.ARM32
2.ARM64
3.去除編譯生成的Crash 中的多餘符号
使用對應的vmLinux解析sysdump檔案
當發生kernel crash時,會有db生成,用GAT的logviewer解開db,裡面有SYS_COREDUMP,結合對應的vmlinux(必須是燒錄前備份的vmlinux!)
三、Crash 指令簡介
Crash(計算機術語)_百度百科baike.baidu.com
四、使用 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/
2. 将
sysdump所有檔案 追加到一個檔案中
3. 使用
crash_arm腳本 聯合
vmlinux解析
sysdump log如果解析失敗,可以參數帶一下參數的指令
32位系統使用如下:
./crash_arm vmlinux all -m phys_base=0x80000000
64位系統使用如下指令:
./crash_arm64 vmlinux all -m phys_offset=0x80000000
4. 使用
Log指令 将
Crash log
追加到指定檔案中
5. 檢視
log
,分析重新開機的具體原因
6. 調高Kernel log Buffer
請将如下兩處修改為=21,增大kernel log buffer後,先抓一份 “進開機向導并能正常啟動至idle” 的ylog。
五、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
至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!