下面是学习整理的一般总结
一:知道具体那个程序导致的crash
1 编译一下 gcc -ggdb xxx.c 重新生成目标文件,方便调试!
2. 输入命令 ulimit -c unlimited ,然后执行 编译后的程序,发生segmentation falut,同时会生成一个文件core.xxxx(xxxx means pid) 。
3 .gdb a.out core.xxxx ,并gdb > bt 马上就会输出错误代码所在的文件和行数,同时还打印出这句错误的语句。
二: 系统比较大,不知道具体哪个程序导致的?
在做测试前,最好先收集一些信息以备后用
1 收集所有进程信息 ps -t
2 内核打印信息: dmesg
.
3 抓取所有信息 logcat &
出现问题后如何处理?
reset 后查看出现问题的进程:cat /proc/XXX(PID)/maps的memory map
根据pc代码行配合 arm-eabi-addr2line可以发掘出错位置所对应的函数名。用法如下;
arm-eabi-addr2line -f -e libmyjni.so 0×00024039 (输出日志中最上面的pc值,可以回溯最终函数调用顺序)
反汇编 相关的动态库或程序:prebuilt/Linux/toolchain-eabi-4.2.1/bin/arm-elf-objdump -d out/target/product/XXXX/symbols/android/lib/XXX.so
下面一堆信息如何处理?需要使用"stack"工具结合符号信息表翻译出具体的函数关系与行数!
r0 00000000 r1 49189c24 r2 00000038 r3 00000080
r4 a9706110 r5 49189c24 r6 49189d48 r7 00000000
r8 49189d9c r9 430f0eb4 10 430f0e9c fp 002d35f8
ip 00000000 sp 49189c10 lr a97036ed pc a970335c cpsr 20000030
、