当前位置: 首页 > news >正文

Android——coredump解析

撰写不易,转载需注明出处:http://blog.csdn.net/jscese/article/details/46916869本文来自 【jscese】的博客!

coredump文件生成
前文Android——coredump 配置 记录了android平台上的环境配置,生成方式 正常即为process触发那几种signal

手动coredump状态:
连接gdb -gcore pid
终端发送signal终止process: kill -s signal pid 自然发送能产生coredump的signal ,前文有记录,但是有时一次还杀不掉process signal可以被忽视。
signal可参考:

root@:/ # kill -l 
1 HUP Hangup 33 33 Signal 33 
2 INT Interrupt 34 34 Signal 34 
3 QUIT Quit 35 35 Signal 35 
4 ILL Illegal instruction 36 36 Signal 36 
5 TRAP Trap 37 37 Signal 37 
6 ABRT Aborted 38 38 Signal 38 
7 BUS Bus error 39 39 Signal 39 
8 FPE Floating point exception 40 40 Signal 40 
9 KILL Killed 41 41 Signal 41 
10 USR1 User signal 1 42 42 Signal 42 
11 SEGV Segmentation fault 43 43 Signal 43 
12 USR2 User signal 2 44 44 Signal 44 
13 PIPE Broken pipe 45 45 Signal 45 
14 ALRM Alarm clock 46 46 Signal 46 
15 TERM Terminated 47 47 Signal 47 
16 STKFLT Stack fault 48 48 Signal 48 
17 CHLD Child exited 49 49 Signal 49 
18 CONT Continue 50 50 Signal 50 
19 STOP Stopped (signal) 51 51 Signal 51 
20 TSTP Stopped 52 52 Signal 52 
21 TTIN Stopped (tty input) 53 53 Signal 53 
22 TTOU Stopped (tty output) 54 54 Signal 54 
23 URG Urgent I/O condition 55 55 Signal 55 
24 XCPU CPU time limit exceeded 56 56 Signal 56 
25 XFSZ File size limit exceeded 57 57 Signal 57 
26 VTALRM Virtual timer expired 58 58 Signal 58 
27 PROF Profiling timer expired 59 59 Signal 59 
28 WINCH Window size changed 60 60 Signal 60 
29 IO I/O possible 61 61 Signal 61 
30 PWR Power failure 62 62 Signal 62 
31 SYS Bad system call 63 63 Signal 63 
32 32 Signal 32 64 64 Signal 64

gdb调试coredump
以simplejni apk中 jni崩溃 得到的core.droid.simplejni.1797文件拷贝到编译源码的根目录为例

源码目录下使用编译工具链的gdb
也可以cygwin终端下或者eclipse环境下使用ndk的gdb操作,经过多次调试发现有的动态库中的symbol信息, ndk的gdb无法显示完全!

开启android gdb:
./prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gdb
1
2.gdb模式下设置动态库搜索加载路径:

set solib-search-path /home/..../out/target/product/../symbols/system/lib/
1
设置到源码编译的out目录下的symbol

3.加载启动程序:

file out/target/product/../symbols/system/bin/XXX
//app进程最后XXX就是app_process32,zygote的启动程序,根据情况修改
4.加载core文件:

5.常用命令:
==============command=========
set logging on/off log保存

backtrace(bt) n 回溯n个调用栈

list n 显示源码 或者显示行数
list - 向上显示

set listsize n 设置打印行数

frame(f) n 切换栈帧
info frame(f) 0 第几栈帧的信息

info args 显示当前栈帧函数参数

info locals 当前帧函数局部变量

info threads / thread n 查看线程信息/切换线程

info (all-)register/ info r rname 查看全部寄存器/根据寄存器名查看

info line filename:func/line 查看文件中某行代码当时在内存中的地址:

 

disassemble fuc / disassemble $pc 反汇编函数/反汇编pc寄存器指向的指令所属函数:

 

x/fu address 查看内存中的值
f表示显示方式, 可取如下值
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。

u表示一个地址单元的长度
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节

pc 的值为下一条指令存放的地址,此时的pc值所指向的指令为:


后面0x2004681b代表的即为汇编的arm指令

此时执行的指令是 ldr r3, [r3, #0]
加载 [r3, #0] 地址的值给 r3寄存器, 可以看到前面还有一句:
movs r3, #0 设成了0
可查看r3 寄存器当前的值,p X:

 

这里就是从 0 地址加载,访问了 0地址内存,空指针,导致段错误

记录

报非法指令,反汇编看到pc所指的指令,这里指向的是gdb反汇编了symbol下对应的动态库(libsurfaceflinger.so)再根据内存地址以及在动态库中的偏移得到的,同样可以查看当时内存中的指令:

 

由于报非法指令,我们可以手动去反汇编libsurfaceflinger.so 校验一下实际的与内存中的指令是否一致:
源码目录下:

prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-objdump -S -D out/target/product/../symbols/system/lib/libsurfaceflinger.so > libsurfaceflinger.txt
1
objdump -x obj 以某种分类信息的形式把目标文件的数据组织(被分为几大块)输出 <可查到该文件的所有动态库>

objdump -t obj 输出目标文件的符号表()

objdump -h obj 输出目标文件的所有段概括()

objdump -j .text/.data -S obj 输出指定段的信息,大概就是反汇编源代码把

objdump -S obj C语言与汇编语言同时显示
1
2
3
4
5
6
7
8
9
查看libsurfaceflinger.txt汇编文件
可根据上面的 info line 得到的地址与这里的地址算偏移,算出libsurfaceflinger.txt中应该对应的指令

或者以没有崩溃前的cat /proc/4702(pid)/maps 查看内存映射,算偏移地址得到指令:

//动态库被加载到内存的映射
root:/ # cat /proc/4702(pid)/maps | grep surface
b6ec5000-b6ef4000 r-xp 00000000 5d:10 1567 /system/lib/libsurfaceflinger.so
b6ef4000-b6ef9000 r--p 0002e000 5d:10 1567 /system/lib/libsurfaceflinger.so
b6ef9000-b6efa000 rw-p 00033000 5d:10 1567 /system/lib/libsurfaceflinger.so
b6feb000-b6fed000 r-xp 00000000 5d:10 464 /system/bin/surfaceflinger
b6fed000-b6fee000 r--p 00001000 5d:10 464 /system/bin/surfaceflinger
一共有6列
第一列代表内存段的虚拟地址
第二列代表执行权限,r,w,x不必说,p=私有 s=共享
不用说,heap和stack段不应该有x,否则就容易被xx,不过这个跟具体的版本有关
第三列代表在进程地址里的偏移量
第四列映射文件的主设备号和次设备号
通过 cat /proc/devices
得知fd是253 device-mapper
第五列映像文件的节点号,即inode
第六列是映像文件的路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
这里发现内存中指令是对的,考虑可能是cpu取指出错

//汇编
//寄存器存储
stmia, 比如当前ro指向的内存地址是 0x1000,STMIA RO!,{R1-R7} 就是 首先把r1存入 0x1000,
然后r2存入0x1004,然后r3存入0x1008,如果是32位的处理器就是每次加4个字节,以此类推把 r1-r7按照递增的地址存入。。。。
这个r0!就是从r0的地址开始存的意思。。。

stmia.w r11, {r2, r3, r4, r5} //.w的意思是告诉编译器,这条指令采用32bit编码。
相同:
str.w r2 [r11] //将寄存器r2的值存入r11指向的地址上 ,寄存器本身r11本身的值不变
str.w r3, [r11,#4]
str.w r4, [r11,#8]
str.w r5, [r11,#12]

32bit 一次+4 byte

stmdb 则是地址从r0开始减少,依次存储。。。

暂时记录这么多~ 后续有需要再添加~
---------------------
作者:南丶烟
来源:CSDN
原文:https://blog.csdn.net/jscese/article/details/46916869
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/Ph-one/p/10870727.html

相关文章:

  • 记录linux 生成crash dump文件步骤
  • Kafka使用kclient三种使用方法
  • 一文简述多种强化学习算法,重要概念和术语一览
  • [linux time命令学习篇] time 统计命令执行的时间
  • Linux上shell脚本date的用法
  • linux下的shell运算(加、减、乘、除)
  • shell中的for循环用法详解
  • 中药介绍
  • linux下的usb抓包方法
  • 自旋锁spin_lock和raw_spin_lock
  • git 优雅的撤销中间某次提交
  • 让个人域名下GithubPage完美支持https
  • CloudFlare 新手入门中文教程
  • DNS解析类型的区别
  • 免费版CloudFlare CDN基本设置参考
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • docker容器内的网络抓包
  • es6(二):字符串的扩展
  • python学习笔记-类对象的信息
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 程序员该如何有效的找工作?
  • 构建工具 - 收藏集 - 掘金
  • 回顾 Swift 多平台移植进度 #2
  • 如何在GitHub上创建个人博客
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • #if和#ifdef区别
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (Git) gitignore基础使用
  • (分布式缓存)Redis分片集群
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (十八)SpringBoot之发送QQ邮件
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)EXC_BREAKPOINT僵尸错误
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net 获取url的方法
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • [android] 看博客学习hashCode()和equals()
  • [C/C++]数据结构 堆的详解
  • [Delphi]一个功能完备的国密SM4类(TSM4)[20230329更新]
  • [docker] Docker的数据卷、数据卷容器,容器互联
  • [emacs] CUA的矩形块操作很给力啊
  • [IDF]摩斯密码
  • [Linux]如何理解kernel、shell、bash
  • [OLEDB] 目前还找找不到处理下面错误的办法
  • [python] dataclass 快速创建数据类
  • [ubuntu]split命令分割文件
  • [Unity Sentis] Unity Sentis 详细步骤工作流程
  • [Unity+智谱AI开放平台]调用ChatGLM Tuobo模型驱动AI小姐姐数字人
  • [Web开发] PSD 转换成HTML/CSS 的工具网站
  • [单片机框架][drivers层][cw2015/ADC] fuelgauge 硬件电量计和软件电量计(一)