當android系統(tǒng)運行出現(xiàn)死機等致命錯誤的時候,,一般會有堆棧的DEBUG打印信息,,一般直接看根本看不出問題是出在哪里!記錄下我android4.2 的DEBUG 堆棧log的方法.
一.DEBUG log
這是我出現(xiàn)錯誤的堆棧信息:
需要分析上面的DEBUG,,只需要提取一部分內(nèi)容然后保存到一個 txt 文本里面,,提取如下內(nèi)容:
- #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,需要注意保存內(nèi)容的間隔對齊。
二.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 版本可能也有所不同,,需要自己根據(jù)自己的源碼進行配置.
我這android4.2 還需要cp OUT/system/lib/egl/libGLES_android.so 到 OUT/system/lib目錄下 供上面的腳本使用
三.解析
在上面兩步做好之后,將DEBUG.py 以及 error.txt cp 到 android 源碼的根目錄下,,執(zhí)行:
- python DEBUG.py error.txt
根據(jù)我上面的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*)
這就是出問題的根源,,可根據(jù)這個DEBUG
|