Android利用addr2line分析traces.txt

traces文件

android出现anr后会在手机中生成如下文件/data/anr/traces.txt。
利用adb pull取出后,就可以分析啦。

addr2line

addr2line是用来解析符号表的工具,是个python3的脚本,可以根据自己的需求修改。命令如下:python3 addr2line.py -dump traces.txt -sym 源码/out/target/product/xxx/symbols/ -cpp -force 然后可以重定向新的文件方便查看。

例子

场景

手机otg连接u盘,里面有很多音频/视频/图片,然后用文件管理器查看,加载的过程中,拔掉otg线,手机卡顿,然后systemUI出现anr

log文件

05-25 15:42:56.936 2654 2719 E ActivityManager: ANR in com.android.systemui
05-25 15:42:56.936 2654 2719 E ActivityManager: PID: 3111
05-25 15:42:56.936 2654 2719 E ActivityManager: Reason: Broadcast of Intent 
{ act=android.intent.action.TIME_TICK flg=0x50000014 (has extras) } 
05-25 15:42:56.936 2654 2719 E ActivityManager: Load: 13.84 / 9.53 / 7.99
05-25 15:42:56.936 2654 2719 E ActivityManager: CPU usage from 0ms to 29604ms later (2017-05-25 15:42:27.293 to 2017-05-25 15:42:56.896):
05-25 15:42:56.936 2654 2719 E ActivityManager: 94% 25870/sdcard: 5.3% user + 88% kernel / faults: 8 minor 
05-25 15:42:56.936 2654 2719 E ActivityManager: 11% 25375/kworker/u8:0: 0% user + 11% kernel
05-25 15:42:56.936 2654 2719 E ActivityManager: 7.9% 25397/kworker/u8:4: 0% user + 7.9% kernel
05-25 15:42:56.936 2654 2719 E ActivityManager: 7.6% 25885/kworker/u8:5: 0% user + 7.6% kernel
05-25 15:42:56.936 2654 2719 E ActivityManager: 7.3% 2654/system_server: 4.4% user + 2.9% kernel / faults: 2445 minor 37 major 
05-25 15:42:56.936 2654 2719 E ActivityManager: 6.3% 20769/kworker/u8:8: 0% user + 6.3% kernel
05-25 15:42:56.936 2654 2719 E ActivityManager: 3.2% 23494/com.cloudminds.filemanager: 1.6% user + 1.5% kernel / faults: 1995 minor 
05-25 15:42:56.936 2654 2719 E ActivityManager: 2.7% 24528/com.baidu.searchbox: 1.9% user + 0.7% kernel / faults: 757 minor 42 major 
05-25 15:42:56.936 2654 2719 E ActivityManager: 1.9% 390/irq/431-fsc_int: 0% user + 1.9% kernel
05-25 15:42:56.936 2654 2719 E ActivityManager: 1.5% 8/rcu_sched: 0% user + 1.5% kernel
05-25 15:42:56.936 2654 2719 E ActivityManager: 1.5% 7/rcu_preempt: 0% user + 1.5% kernel
05-25 15:42:56.936 2654 2719 E ActivityManager: 1% 4149/com.android.phone: 0.4% user + 0.6% kernel / faults: 1469 minor 14 major 
05-25 15:42:56.936 2654 2719 E ActivityManager: 0.8% 11/migration/1: 0% user + 0.8% kernel

发现sdcard中的kernel调用占用大量cpu导致systemUI出现anr。

trace文件

25870/sdcard: 5.3% user + 88% kernel
直接查看trace文件中的pid是25870的sdard相关内容

----- pid 25870 at 2017-05-25 15:42:53 -----
Cmd line: /system/bin/sdcard
ABI: 'arm64'

"sdcard" sysTid=25870
  #00 pc 000000000006b4f0  /system/lib64/libc.so (read+4)
  #01 pc 000000000000290c  /system/bin/sdcard
  #02 pc 000000000001a7d8  /system/lib64/libc.so (__libc_init+88)
  #03 pc 0000000000001ca0  /system/bin/sdcard

"sdcard" sysTid=25871
  #00 pc 000000000006aa44  /system/lib64/libc.so (__getdents64+8)
  #01 pc 000000000001e36c  /system/lib64/libc.so (readdir+100)
  #02 pc 0000000000004d80  /system/bin/sdcard
  #03 pc 00000000000037f8  /system/bin/sdcard
  #04 pc 0000000000068618  /system/lib64/libc.so (_ZL15__pthread_startPv+196)
  #05 pc 000000000001df68  /system/lib64/libc.so (__start_thread+16)

"sdcard" sysTid=25872
  #00 pc 000000000006b4f0  /system/lib64/libc.so (read+4)
  #01 pc 0000000000002fd8  /system/bin/sdcard
  #02 pc 0000000000068618  /system/lib64/libc.so (_ZL15__pthread_startPv+196)
  #03 pc 000000000001df68  /system/lib64/libc.so (__start_thread+16)

"sdcard" sysTid=25873
  #00 pc 000000000006b4f0  /system/lib64/libc.so (read+4)
  #01 pc 0000000000002fd8  /system/bin/sdcard
  #02 pc 0000000000068618  /system/lib64/libc.so (_ZL15__pthread_startPv+196)
  #03 pc 000000000001df68  /system/lib64/libc.so (__start_thread+16)

----- end 25870 -----

发现都是libc和sdcard的相关堆栈,不知道是具体哪个函数,所以要用addr2line通过符号表解析出来。

addr2line解析结果

用最开始的例子的命令格式解析后,找到sdcard相关内容如下

"sdcard" sysTid=25870
#00 pc 000000000006b4f0 /system/lib64/libc.so read 于 read.S:7
#01 pc 000000000000290c /system/bin/sdcard read 于 unistd.h:465
(已内连入) watch_package_list 于 sdcard.c:1944
(已内连入) run 于 sdcard.c:2123
(已内连入) main 于 sdcard.c:2325
#02 pc 000000000001a7d8 /system/lib64/libc.so __libc_init 于 libc_init_dynamic.cpp:119
#03 pc 0000000000001ca0 /system/bin/sdcard do_arm64_start 于 sdcard.c:?
"sdcard" sysTid=25871
#00 pc 000000000006aa44 /system/lib64/libc.so __getdents64 于 __getdents64.S:9
#01 pc 000000000001e36c /system/lib64/libc.so __fill_DIR(DIR*) 于 dirent.cpp:96 (discriminator 1)
(已内连入) __readdir_locked(DIR*) 于 dirent.cpp:106 (discriminator 1)
(已内连入) readdir 于 dirent.cpp:121 (discriminator 1)
#02 pc 0000000000004d80 /system/bin/sdcard find_file_within 于 sdcard.c:391
#03 pc 00000000000037f8 /system/bin/sdcard handle_lookup 于 sdcard.c:811 (discriminator 1)
(已内连入) handle_fuse_request 于 sdcard.c:1703 (discriminator 1)
(已内连入) handle_fuse_requests 于 sdcard.c:1854 (discriminator 1)
(已内连入) start_handler 于 sdcard.c:1871 (discriminator 1)
#04 pc 0000000000068618 /system/lib64/libc.so __pthread_start(void*) 于 pthread_create.cpp:198 (discriminator 1)
#05 pc 000000000001df68 /system/lib64/libc.so __start_thread 于 clone.cpp:41 (discriminator 1)
"sdcard" sysTid=25872
#00 pc 000000000006b4f0 /system/lib64/libc.so read 于 read.S:7
#01 pc 0000000000002fd8 /system/bin/sdcard read 于 unistd.h:465
(已内连入) handle_fuse_requests 于 sdcard.c:1828
(已内连入) start_handler 于 sdcard.c:1871
#02 pc 0000000000068618 /system/lib64/libc.so __pthread_start(void*) 于 pthread_create.cpp:198 (discriminator 1)
#03 pc 000000000001df68 /system/lib64/libc.so __start_thread 于 clone.cpp:41 (discriminator 1)
"sdcard" sysTid=25873
#00 pc 000000000006b4f0 /system/lib64/libc.so read 于 read.S:7
#01 pc 0000000000002fd8 /system/bin/sdcard read 于 unistd.h:465
(已内连入) handle_fuse_requests 于 sdcard.c:1828
(已内连入) start_handler 于 sdcard.c:1871
#02 pc 0000000000068618 /system/lib64/libc.so __pthread_start(void*) 于 pthread_create.cpp:198 (discriminator 1)
#03 pc 000000000001df68 /system/lib64/libc.so __start_thread 于 clone.cpp:41 (discriminator 1)
----- end 25870 ----- 

查看sdcard源码

路径system/core/sdcard/sdcard.c
对应于解析后的文件,找到find_file_within的函数

        while ((entry = readdir(dir))) {
            if (!strcasecmp(entry->d_name, name)) {
                /* we have a match - replace the name, don't need to copy the null again */
                memcpy(actual, entry->d_name, namelen);
                break;
            }
        }
        closedir(dir);

发现最后是在readdir文件中,这个需要看kernel中的情况啦。

分析kernel文件

后面就是根据这个trace文件继续看代码啦,和sdcard的情况类似,这里就不详说啦。

后记

本文就是记录利用addr2line分析anr的一种思路。 anr的出现有各种情况,基本上要case by case的看。但是思路都差不多,就是利用android log和trace文件结合着看。如果是必现的情况则也可以通过增加log复现然后解决问题,如果是偶现的则只能通过log和代码的蛛丝马迹来推测啦。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容

  • ==================================================== 一:什么...
    爱情小傻蛋阅读 9,608评论 3 31
  • ANR问题,相信是每位开发日常都会遇到的问题,对于这类问题的分析,按照官方的推荐,或网络博客的总结思路能解决一定的...
    tiger桂阅读 17,437评论 5 27
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 物以稀为贵,这句话我们耳熟能详了。可是在理解上还应该增加一个条件,那就是这个“稀”必须有“需”作为前提。就像这个世...
    巧克力伐雷阅读 320评论 0 0
  • 朋友一直喜欢亲子相关信息收集,于是她弄了一个分享各种打折游乐场和出游资讯汇总群,群里会经常发送打折活动,团购活动和...
    黑黑白糖阅读 224评论 0 1