全志平台Android 系统调试方法(4)系统异常调试

以下技术在盈鹏飞嵌入式的A40I/T3核心板(CoM-X40I)和主控板(SBC-X40I)上经过验证,欢迎 交流! CoM-X40I核心板和SBC-X40I主板见下图:.在这里插入图片描述
在这里插入图片描述
在这里插入图片描述




1. 前言

这里总结几种系统异常时,常用的几种调试方法

2. Debuggerd

Debuggerd 和 echo t > /proc/sysrq-trigger

一起调试进程空间和内核空间死锁、睡眠问题

3.Kill命令

Kill -6 可以打印所有进程的core dump backtrace,

数据会保存到/data/tombstones/tombstone_0{0..9}递增文件中,

同时也会打印一份保存到 data/anr/traces.txt文件中。

其效果和debuggerd 打印的core dump结果一致;

Kill -3 可以打印zygote进程空间的core dump backtrac,

数据只保存到/data/anr/traces.txt文件中,

类似于AMS 中watchdog服务检查到ANR后打出的traces.txt结果一致;

4.Strace


 
 
  1. usage: strace [ -CdffhiqrtttTvVxxy] [ -I n] [ -e expr]...
  2. [ -a column] [ -o file] [ -s strsize] [ -P path]...
  3. -p pid... / [ -D] [ -E var =val]... [ -u username] PROG [ARGS]
  4. or: strace -c[df] [ -I n] [ -e expr]... [ -O overhead] [ -S sortby]
  5. -p pid... / [ -D] [ -E var =val]... [ -u username] PROG [ARGS]
  6. -c -- count time, calls, and errors for each syscall and report summary
  7. -C -- like -c but also print regular output
  8. -w -- summarise syscall latency (default is system time)
  9. -d -- enable debug output to stderr
  10. -D -- run tracer process as a detached grandchild, not as parent
  11. -f -- follow forks, -ff -- with output into separate files
  12. -i -- print instruction pointer at time of syscall
  13. -q -- suppress messages about attaching, detaching, etc.
  14. -r -- print relative timestamp, -t -- absolute timestamp, -tt -- with usecs
  15. -T -- print time spent in each syscall
  16. -v -- verbose mode: print unabbreviated argv, stat, termios, etc. args
  17. -x -- print non-ascii strings in hex, -xx -- print all strings in hex
  18. -y -- print paths associated with file descriptor arguments
  19. -h -- print help message, -V -- print version
  20. -a column -- alignment COLUMN for printing syscall results (default 40)
  21. -b execve -- detach on this syscall
  22. -e expr -- a qualifying expression: option=[!]all or option=[!]val1[,val2]...
  23. options: trace, abbrev, verbose, raw, signal, read, write
  24. -I interruptible --
  25. 1: no signals are blocked
  26. 2: fatal signals are blocked while decoding syscall ( default)
  27. 3: fatal signals are always blocked ( default if '-o FILE PROG')
  28. 4: fatal signals and SIGTSTP ( ^Z) are always blocked
  29. (useful to make 'strace -o FILE PROG' not stop on ^Z)
  30. -o file -- send trace output to FILE instead of stderr
  31. -O overhead -- set overhead for tracing syscalls to OVERHEAD usecs
  32. -p pid -- trace process with process id PID, may be repeated
  33. -s strsize -- limit length of print strings to STRSIZE chars (default 32)
  34. -S sortby -- sort syscall counts by: time, calls, name, nothing (default time)
  35. -u username -- run command as username handling setuid and/or setgid
  36. -E var =val -- put var=val in the environment for command
  37. -E var -- remove var from the environment for command
  38. -P path -- trace accesses to path

strace -Ff -p 1364 -T

strace -Ff -p 1364 -T -r

strace -Ff -p 1364 -T -t

或者 strace -Ff -p 1364 -T -tt

strace -Ff -p 1364 -T -tt -o /data/strace.log

strace -Ff -p 1364 -c 系统调用耗时

strace -Ff -p 1364 -c -w等待系统调用耗时

strace -Ff -p 1364 -y -tt -T

5. 应用进程ANR

(1)首先通过strace -fF -p {$PID} 确认到具体的线程ANR状态

(2)通过debuggerd -b {$PID} 确认线程backtrace栈状态

(3)异步等待 ANR线程A:A1在等待同一个进程空间的线程A:B1处理任务,再通过strace追踪线程状态;

(4)同步睡眠 ANR线程A:A1在等待一个锁,检查锁被哪个线程占用;

(5)系统调用阻塞 ANR线程A:A1在系统调用中发生睡眠,打印出进程在内核空间的栈分析系统调用睡眠原因

(6)进程间通信等待 ANR线程A:A1在进程间通信binder过程中睡眠,

通过当前进程proc的binder线程状态确认线程等待关系,

例如线程A:A1等待线程B:B1,通过strace或者debuggerd确认线程B:B1状态,

对B:B1 的分析同样要去判断是否发生异步等待、同步睡眠、统调用阻塞和进程间通信等待

6. Monkey稳定性问题

monkey问题排查思路,monkey测试停止,无非有两种情况:

  • 系统异常重启;
  • 内核内存回收oom kill掉monkey(内存泄漏)

(1)android场景下,一般都是a情况,针对a情况,有很多类型:

1). 系统native重要进程abort掉,父进程init进程kill掉所有子进程,重启系统;

2). system server watchdog 检测到ANR,kill掉system server,zygote检测到system server子进程退出,自己kill掉自己,init检测到子进程ygote退出后,kill掉所有的子进程重启;

3). system server 进程空间线程发生异常abort掉,走了2)的流程

(2)排查此类问题,首先要从后台log中,检查a情况是否发生,通过搜索关键字

AndroidRuntime START com.android.internal.os.ZygoteInit

如果关键字发生两次以上,说明系统发生了重启,确认了a类问题后,仍需进一步确认1)、2)、3)三类情况中的哪一种,方法如下:

针对1)类问题,搜索一下关键字,然后反向搜索,确认是否是系统native进程例如surfaceflinger发生异常; ServiceManager( 1584): service 'display' died

ServiceManager( 1584): service 'usagestats' died

ServiceManager( 1584): service 'batterystats' died

针对2)类问题,执行搜索关键字: WATCHDOG KILLING SYSTEM PROCESS

针对3)类问题,执行搜索关键字: system_server

(3)现场问题分析注意事项:

首先要在log文件中,确认Zygote 和 SystemServer进程pid,

然后才能去检索第一现场附件的log,一旦系统出现多次重启,

很容易迷失在log中。

系统Zygote初始化关键字:

01-01 08:01:53.770 D/AndroidRuntime( 1590): >>>>>> AndroidRuntime START com.android.internal.os.ZygoteInit <<<<<< Zygote初始化system server关键字: 01-01 08:02:01.210 I/dalvikvm( 1590): System server process 2369 has been created 01-01 08:02:01.220 I/SystemServer( 2369): start SystemServer main :16606

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值