当android系统运行出现死机等致命错误的时候,一般会有堆栈的DEBUG打印信息,一般直接看根本看不出问题是出在哪里!记录下我android4.2 的DEBUG 堆栈log的方法.
一.DEBUG log
这是我出现错误的堆栈信息:
需要分析上面的DEBUG,只需要提取一部分内容然后保存到一个 txt 文本里面,提取如下内容:
- #00 pc 00019570 /system/lib/libc.so
- #01 pc 0001febd /system/lib/libc.so
- #02 pc 00021303 /system/lib/libc.so
- #03 pc 0000139d /system/lib/liblog.so
- #04 pc 0000caa9 /system/bin/vold
保存到error.txt,需要注意保存内容的间隔对齐。
二.python
需要一个分析上面提取出来的error.txt DEBUG 信息 DEBUG.py:
-
-
- import os
- import string
- import sys
-
-
-
- ANDROID_PRODUCT_NAME = 'gotechcn'
-
-
- ANDROID_WORKSPACE = os.getcwd()+"/"
-
-
-
- addr2line_tool = ANDROID_WORKSPACE + 'prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-addr2line'
- symbol_dir = ANDROID_WORKSPACE + 'out/target/product/' + ANDROID_PRODUCT_NAME +'/symbols'
- symbol_bin = symbol_dir + '/system/bin/'
- symbol_lib = symbol_dir + '/system/lib/'
-
-
-
-
- class ReadLog:
- def __init__(self,filename):
- self.logname = filename
- def parse(self):
- f = file(self.logname,'r')
- lines = f.readlines()
- if lines != []:
- print 'read file ok'
- else:
- print 'read file failed'
- result =[]
- for line in lines:
- if line.find('stack') != -1:
- print 'stop search'
- break
- elif line.find('system') != -1:
-
- result.append(line)
- return result
-
-
- class ParseContent:
- def __init__(self,addr,lib):
- self.address = addr
- self.exename = lib
- def addr2line(self):
- cmd = addr2line_tool + " -C -f -s -e " + symbol_dir + self.exename + " " + self.address
-
- stream = os.popen(cmd)
- lines = stream.readlines()
- list = map(string.strip,lines)
- return list
-
- inputarg = sys.argv
- if len(inputarg) < 2:
- print 'Please input panic log'
- exit()
-
-
- filename = inputarg[1]
- readlog = ReadLog(filename)
- inputlist = readlog.parse()
-
-
- for item in inputlist:
- itemsplit = item.split()
- test = ParseContent(itemsplit[-2],itemsplit[-1])
- list = test.addr2line()
- print "%-30s%s" % (list[1],list[0])
这个python脚本是google提供的,用来分析DEBUG,需要注意的是配置自己相对应的ANDROID_PRODUCT_NAME,用来在你的android源码里面找对应的工具,我的product_name 为 “gotechcn”。
addr2line_tool 的路径各个android 版本可能也有所不同,需要自己根据自己的源码进行配置.
我这android4.2 还需要cp OUT/system/lib/egl/libGLES_android.so 到 OUT/system/lib目录下 供上面的脚本使用
三.解析
在上面两步做好之后,将DEBUG.py 以及 error.txt cp 到 android 源码的根目录下,执行:
- python DEBUG.py error.txt
根据我上面的error.txt 可得到如下结果:
- read file ok
- strlen.c:52 strlen
- string.h:221 strlen
- vsnprintf.c:61 vsnprintf
- stdio.h:490 __android_log_buf_print
- DirectVolume.cpp:291 DirectVolume::handleDiskChanged(char const*, NetlinkEvent*)
这就是出问题的根源,可根据这个DEBUG
|