crash工具解析_Android Crash 工具

c151e436dd86764e2700e2b370964cef.png

本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

af8db9b6305a6fcb297806ca34546c40.png

一、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),如果没有需要

982f5d8bbd9fda7c8ace9be8a0988361.png

3. 编译 ARM32 / ARM64 位的Crash

1.ARM32

219919be808a5bfc993ecd6856cee482.png

2.ARM64

da74655d56215f99425407d4d2d79db0.png

3.去除编译生成的Crash 中的多余符号

4806332813e63558a834f7a2913e1e1c.png

使用对应的vmLinux解析sysdump文件
当发生kernel crash时,会有db生成,用GAT的logviewer解开db,里面有SYS_COREDUMP,结合对应的vmlinux(必须是烧录前备份的vmlinux!)

01d17b661f742d2a9fa7681e9c6ef5d4.png

三、Crash 命令简介

Crash(计算机术语)_百度百科​baike.baidu.com
b79d562949d81d7a288e6d27660896b6.png

四、使用 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/

641574cbd031658fa5fc88c880959d18.png

2. 将 sysdump 所有文件 追加到一个文件中

7785feb7154ebb9daa5ff50ae0a6f4cc.png

3. 使用 crash_arm 脚本 联合 vmlinux 解析 sysdump log

如果解析失败,可以参数带一下参数的命令

32位系统使用如下:

./crash_arm vmlinux all -m phys_base=0x80000000

64位系统使用如下命令:

./crash_arm64 vmlinux all -m phys_offset=0x80000000

b3bafdea39c408f562ee8ae7e3b14028.png

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

f1bb98bbbdc6b79bcad9ac68849374f9.png

5. 查看log,分析重启的具体原因

c1ffaa71790b67c65da9405e017da7eb.png

6. 调高Kernel log Buffer

请将如下两处修改为=21,增大kernel log buffer后,先抓一份 “进开机向导并能正常启动至idle” 的ylog。

e7f65a6379950ab5bca1ea5592ae34fa.png

五、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

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。本书从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。 第1章 Activity的生命周期和启动模式 1 1.1 Activity的生命周期全面分析 1 1.1.1 典型情况下的生命周期分析 2 1.1.2 异常情况下的生命周期分析 8 1.2 Activity的启动模式 16 1.2.1 Activity的LaunchMode 16 1.2.2 Activity的Flags 27 1.3 IntentFilter的匹配规则 28 第2章 IPC机制 35 2.1 Android IPC简介 35 2.2 Android中的多进程模式 36 2.2.1 开启多进程模式 36 2.2.2 多进程模式的运行机制 39 2.3 IPC基础概念介绍 42 2.3.1 Serializable接口 42 2.3.2 Parcelable接口 45 2.3.3 Binder 47 2.4 Android中的IPC方式 61 2.4.1 使用Bundle 61 2.4.2 使用文件共享 62 2.4.3 使用Messenger 65 2.4.4 使用AIDL 71 2.4.5 使用ContentProvider 91 2.4.6 使用Socket 103 2.5 Binder连接池 112 2.6 选用合适的IPC方式 121 第3章 View的事件体系 122 3.1 View基础知识 122 3.1.1 什么是View 123 3.1.2 View的位置参数 123 3.1.3 MotionEvent和TouchSlop 125 3.1.4 VelocityTracker、GestureDetector和Scroller 126 3.2 View的滑动 129 3.2.1 使用scrollTo/scrollBy 129 3.2.2 使用动画 131 3.2.3 改变布局参数 133 3.2.4 各种滑动方式的对比 133 3.3 弹性滑动 135 3.3.1 使用Scroller 136 3.3.2 通过动画 138 3.3.3 使用延时策略 139 3.4 View的事件分发机制 140 3.4.1 点击事件的传递规则 140 3.4.2 事件分发的源码解析 144 3.5 View的滑动冲突 154 3.5.1 常见的滑动冲突场景 155 3.5.2 滑动冲突的处理规则 156 3.5.3 滑动冲突的解决方式 157 第4章 View的工作原理 174 4.1 初识ViewRoot和DecorView 174 4.2 理解MeasureSpec 177 4.2.1 MeasureSpec 177 4.2.2 MeasureSpec和LayoutParams的对应关系 178 4.3 View的工作流程 183 4.3.1 measure过程 183 4.3.2 layout过程 193 4.3.3 draw过程 197 4.4 自定义View 199 4.4.1 自定义View的分类 200 4.4.2 自定义View须知 201 4.4.3 自定义View示例 202 4.4.4 自定义View的思想 217 第5章 理解RemoteViews 218 5.1 RemoteViews的应用 218 5.1.1 RemoteViews在通知栏上的应用 219 5.1.2 RemoteViews在桌面小部件上的应用 221 5.1.3 PendingIntent概述 228 5.2 RemoteViews的内部机制 230 5.3 RemoteViews的意义 239 第6章 Android的Drawable 243 6.1 Drawable简介 243 6.2 Drawable的分类 244 6.2.1 BitmapDrawable 244 6.2.2 ShapeDrawable 247 6.2.3 LayerDrawable 251 6.2.4 StateListDrawable 253 6.2.5 LevelListDrawable 255 6.2.6 TransitionDrawable 256 6.2.7 Ins

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值