極力推薦Android 開發大總結文章:歡迎收藏
程序員Android 力薦 ,Android 開發者須要的必備技能node
本篇文章主要介紹 Android
開發中的部分知識點,經過閱讀本篇文章,您將收穫如下內容:linux
1、Crash 簡介
2、搭建Crash 分析kernel ramdump平臺
3、Crash 命令簡介
4、使用 Crash 分析 sysdump log
5、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工具支持衆多的內存轉儲文件格式,包括:網絡
而MTK在KE時會抓取full dump文件:SYS_COREDUMP,則能夠用crash來調試。socket
sudo apt-get install libncurses5-dev sudo apt-get install zlib1g-dev
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
./crash vmlinux syscoredump(log)
Crash 命令官方簡介
至此,本篇已結束,若有不對的地方,歡迎您的建議與指正。期待您的關注,
感謝您的閱讀,謝謝!
cp out/target/product/sp9832e_1h10_go/obj/KERNEL/vmlinux reboot/
cp vendor/sprd/tools/crash/crash_arm reboot/
若是解析失敗,能夠參數帶一下參數的命令
32位系統使用以下:
./crash_arm vmlinux all -m phys_base=0x80000000
64位系統使用以下命令:
./crash_arm64 vmlinux all -m phys_offset=0x80000000
Crash log
追加到指定文件中log
,分析重啓的具體緣由請將以下兩處修改成=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
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 |
至此,本篇已結束,若有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!