1.关键字查找:(用于筛选,或者已知问题查找)
1.1由现象快速查找定位
经验主义,通过以往大量log的分析经验, 熟悉已知的fail log。
比如CameraApp Crash log: force stopping com.asus.camera
Camera HAL/daemon crash:backtrace:
其他fail/error
1.2查找log中关键字常用工具
文本工具
Geany : Ctrl+F, then input example: error|fail 查找打开文件带有error,或者fail的行 5星推荐
Sublime: Ctrl + F
Gedit: Ctrl + F
Ubuntu下多文件关键字查找命令
$:grep -ria “error\|fail” 查找目录下面全部的带有error,或者fail的行
2.對比法:(用于确定之前没有遇到的新问题)
2.1与之前正常的log对比
确定复现步骤,抓出复现log,并和自身正常log对比:例如关机异常,则用异常关机那段时间的log与正常关机的log对比
2.2与其他正常机子对比:(同一型号的情况下,多用排除是不是硬件问题导致单机问题)
确定复现步骤,抓出复现log,并和其他正常log对比:如关机异常,则用异常关机那段时间的log与正常关机的log对比
2.3工具:beyond compare,sublime
beyond compare:自动比较工具
Sublime:手动比较
3.Crash log 分析 (非开发者仅可作为找问题辅助参考工具)
程序crash是最严重的bug,crash的时候,大部分程序都会打印自己的backtrace,也就是函数调用栈。
3.1 Backtrace分析
例如下面的backtrace
pid: 24925, tid: 15718, name: CAM_MctServ >>> /system/bin/mm-qcamera-daemon <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x8 mm-qcamera-daemon 程序收到segmentation violation错误通知退出,crash原因是:访问了 错误地址
...
backtrace: (调用顺序自下而上)
#00 pc 000126bc /system/vendor/lib/libmmcamera2_mct.so (mct_list_append+37)
crash发生在最后一个函数mct_list_append里面,代码段地址000126bc
#01 pc 0000c215 /system/vendor/lib/libmmcamera2_mct.so (mct_object_set_branch_parent+28)
#02 pc 0000de8f /system/vendor/lib/libmmcamera2_mct.so (mct_stream_link_branch_modules+98)
#03 pc 0000e9cd /system/vendor/lib/libmmcamera2_mct.so
#04 pc 00008bcd /system/vendor/lib/libmmcamera2_mct.so
#05 pc 000093b7 /system/vendor/lib/libmmcamera2_mct.so
#06 pc 0000b2d7 /system/vendor/lib/libmmcamera2_mct.so
#07 pc 0003fa33 /system/lib/libc.so (_ZL15__pthread_startPv+30)
#08 pc 00019fc5 /system/lib/libc.so (__start_thread+6)
3.2定位crash位置
1有源代码时候,定位工具 addr2line/arm-addr2line
获取symbol文件,编译源码会生成一个带有符号表的同名程序例如
./symbols/system/vendor/lib/libmmcamera2_mct.so
运行命令$:addr2line 000126bc -e ./symbols/system/vendor/lib/libmmcamera2_mct.so
运行实例:
vicent@vicentPC:~/disk2/Hades_Test/out/target/product/Z01H$ addr2line 000126bc -e ./symbols/system/vendor/lib/libmmcamera2_mct.so
/home/vicent/disk2/Hades_Test/vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/mct//tools/mct_util.c:128 (discriminator 1)
Crash位置为:mct_util.c:128行
2没有源代码的时候,定位工具 objdump/arm-linux-androideabi-objdump
由于objdump 为反汇编工具,定位的源码是汇编语言,不能用于定位所有程序的crash位置,在没有源码无可奈何的时候,可作为分析的手段。
[ 98.034] (EE) Backtrace:
[ 98.050] (EE) 0: /usr/lib/xorg/Xorg (xorg_backtrace+0x4a) [0x5564c38399fa]
[ 98.051] (EE) 1: /usr/lib/xorg/Xorg (0x5564c3680000+0x1bdd69) [0x5564c383dd69]
[ 98.051] (EE) 2: /lib/x86_64-linux-gnu/libc.so.6 (0x7f4414093000+0x35860) [0x7f44140c8860]
[ 98.051] (EE) 3: /usr/lib/xorg/Xorg (DRI2CloseScreen+0x35) [0x5564c380cfc5]
[ 98.051] (EE) 4: /usr/lib/xorg/modules/drivers/modesetting_drv.so (0x7f44101c6000+0x6e88) [0x7f44101cce88]
[ 98.051] (EE) 5: /usr/lib/xorg/Xorg (0x5564c3680000+0xc7547) [0x5564c3747547]
[ 98.051] (EE) 6: /usr/lib/xorg/Xorg (0x5564c3680000+0x138d82) [0x5564c37b8d82]
[ 98.051] (EE) 7: /usr/lib/xorg/Xorg (0x5564c3680000+0xe5978) [0x5564c3765978]
[ 98.051] (EE) 8: /usr/lib/xorg/Xorg (0x5564c3680000+0x137034) [0x5564c37b7034]
[ 98.051] (EE) 9: /usr/lib/xorg/Xorg (0x5564c3680000+0x57531) [0x5564c36d7531]
[ 98.051] (EE) 10: /lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main+0xf1) [0x7f44140b33f1]
[ 98.051] (EE) 11: /usr/lib/xorg/Xorg (_start+0x2a) [0x5564c36c133a]
命令$: objdump -d -S -l /usr/lib/xorg/Xorg > source.S| grep -i “1bdd69”
3.3其他
Ubuntu crash
https://wiki.ubuntu.com/Apport
/var/crash/
apport-retrace使用
http://www.piware.de/2011/08/apport-retrace-made-useful/
apport-retrace -s -S system /var/crash/_usr_bin_gedit.1000.crash
apport-retrace -g -S system /var/crash/_usr_bin_gedit.1000.crash