隨筆-1  評論-68  文章-98  trackbacks-0
          作者:徐建祥(netpirate@gmail.com)
          日期:2010/03/06
          網址:http://www.anymobile.org

          調試步驟如下:
          1/ 將異常的地址信息存到文本文件,并存放在項目根目錄;
          2/ 使用panic.py解析該文件;
          3/ 根據返回的信息(文件名;行號;方法名)調試程序。

          以操作第三方的Touch input 輸入法為例,過程如下:

          # 該輸入法的英文和手寫OK,操作中文輸入法時,出現異常,軟鍵盤消失,異常日志如下
          02-05 06:41:19.834 D/dalvikvm(  751): Trying to load lib /system/lib/libimezi.so 0x43e2a788
          02-05 06:41:19.874 D/dalvikvm(  751): Added shared lib /system/lib/libimezi.so 0x43e2a788
          02-05 06:41:20.035 I/DEBUG   (  551): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
          02-05 06:41:20.035 I/DEBUG   (  551): Build fingerprint: 'unknown'
          02-05 06:41:20.035 I/DEBUG   (  551): pid: 751, tid: 751  >>> com.htc.android.cime <<<
          02-05 06:41:20.045 I/DEBUG   (  551): signal 11 (SIGSEGV), fault addr 00000003
          02-05 06:41:20.045 I/DEBUG   (  551):  r0 00000000  r1 00000000  r2 807248ec  r3 807248ec
          02-05 06:41:20.055 I/DEBUG   (  551):  r4 00252d80  r5 00000004  r6 00000001  r7 00000000
          02-05 06:41:20.055 I/DEBUG   (  551):  r8 beff8550  r9 41459d28  10 41459d18  fp 00000000
          02-05 06:41:20.055 I/DEBUG   (  551):  ip 8072430c  sp beff84f0  lr 80716b4f  pc 80717bce cpsr 60000030
          02-05 06:41:20.135 I/DEBUG   (  551):          #00  pc 00017bce  /system/lib/libimezi.so
          02-05 06:41:20.135 I/DEBUG   (  551):          #01  pc 00010f80  /system/lib/libimezi.so
          02-05 06:41:20.145 I/DEBUG   (  551): stack:
          02-05 06:41:20.155 I/DEBUG   (  551):     beff84b0  ad083e10 
          02-05 06:41:20.155 I/DEBUG   (  551):     beff84b4  ad05d44f  /system/lib/libdvm.so
          02-05 06:41:20.155 I/DEBUG   (  551):     beff84b8  ad06b8a0  /system/lib/libdvm.so
          02-05 06:41:20.155 I/DEBUG   (  551):     beff84bc  ad083e10 
          02-05 06:41:20.167 I/DEBUG   (  551):     beff84c0  43e2aa90 
          02-05 06:41:20.175 I/DEBUG   (  551):     beff84c4  00000003 
          02-05 06:41:20.175 I/DEBUG   (  551):     beff84c8  00000014 
          02-05 06:41:20.185 I/DEBUG   (  551):     beff84cc  80716b4f  /system/lib/libimezi.so

          # 保存異常日志,存為文件: 20100205_ime.txt
          02-05 06:41:20.045 I/DEBUG   (  551):  r0 00000000  r1 00000000  r2 807248ec  r3 807248ec
          02-05 06:41:20.055 I/DEBUG   (  551):  r4 00252d80  r5 00000004  r6 00000001  r7 00000000
          02-05 06:41:20.055 I/DEBUG   (  551):  r8 beff8550  r9 41459d28  10 41459d18  fp 00000000
          02-05 06:41:20.055 I/DEBUG   (  551):  ip 8072430c  sp beff84f0  lr 80716b4f  pc 80717bce  cpsr 60000030
          02-05 06:41:20.135 I/DEBUG   (  551):          #00  pc 00017bce  /system/lib/libimezi.so
          02-05 06:41:20.135 I/DEBUG   (  551):          #01  pc 00010f80  /system/lib/libimezi.so

          # 執行腳本
          xujianxiang@wingdroid-clone:~/workspace/xujx/wing15$ ./panic.py 20100205_ime.txt
          read file ok
          /home/xujianxiang/workspace/xujx/wing15/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-addr2line: '/home/xujianxiang/workspace/xujx/wing15/out/target/product/generic/symbols/system/lib/libimezi.so': No such file
          Traceback (most recent call last):
            File "./panic.py", line 69, in <module>
              print "%-30s%s" % (list[1],list[0])
          IndexError: list index out of range

          # 沒找到庫文件,因為這個文件是第三方的,只存放在/out/target/product/generic/system/lib /libimezi.so,拷貝一份存到/out/target/product/generic/symbols/system/lib /libimezi.so,再次執行腳本
          xujianxiang@wingdroid-clone:~/workspace/xujx/wing15$ ./panic.py 20100205_ime.txt
          read file ok
          zi81keyd.c:0                  Zi8GetTableData
          zi81keyd.c:0                  Zi8InitializeDynamic

          # 成功解析異常,沒有zi8庫文件所致,更新如下庫文件,輸入法支持中文拼音。
          /system/lib/zi/Zi8DatPYP_CN.z8d
          /system/lib/zi/Zi8DatPYS_CN.z8d
          /system/lib/zi/Zi8DatZHA_CN.z8d
          /system/lib/zi/Zi8DatZHA_HK.z8d
          /system/lib/zi/Zi8DatZHA_TW.z8d
          /system/lib/zi/Zi8DatZYP_TW.z8d
          /system/lib/zi/Zi8DatZYS_TW.z8d


          附 panic.py:
           1#!/usr/bin/python
           2# stack symbol parser
           3
           4import os
           5import string
           6import sys
           7
           8#define android product name
           9#ANDROID_PRODUCT_NAME = 'generic'
          10ANDROID_PRODUCT_NAME = 'smdk6410'
          11
          12ANDROID_WORKSPACE = os.getcwd()+"/"
          13
          14# addr2line tool path and symbol path
          15addr2line_tool = ANDROID_WORKSPACE + 'prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-addr2line'
          16symbol_dir = ANDROID_WORKSPACE + 'out/target/product/' + ANDROID_PRODUCT_NAME +'/symbols'
          17symbol_bin = symbol_dir + '/system/bin/'
          18symbol_lib = symbol_dir + '/system/lib/'
          19
          20class ReadLog:
          21    def __init__(self,filename):
          22        self.logname = filename
          23    def parse(self):
          24        f = file(self.logname,'r')
          25        lines = f.readlines()
          26        if lines != []:
          27            print 'read file ok'
          28        else:
          29            print 'read file failed'
          30        result =[]
          31        for line in lines:
          32            if line.find('stack'!= -1:
          33                print 'stop search'
          34                break
          35            elif line.find('system'!= -1:
          36                #print 'find one item' + line
          37                result.append(line)
          38        return result
          39
          40class ParseContent:
          41    def __init__(self,addr,lib):
          42            self.address = addr # pc address
          43            self.exename = lib  # executable or shared library
          44    def addr2line(self):
          45        cmd = addr2line_tool + " -C -f -s -e " + symbol_dir + self.exename + " " + self.address
          46        #print cmd
          47        stream = os.popen(cmd)
          48        lines = stream.readlines();
          49        list = map(string.strip,lines)
          50        return list
          51    
          52inputarg = sys.argv
          53if len(inputarg) < 2:
          54    print 'Please input panic log'
          55    exit()
          56
          57filename = inputarg[1]
          58readlog = ReadLog(filename)
          59inputlist = readlog.parse()
          60
          61for item in inputlist:
          62    itemsplit = item.split()
          63    test = ParseContent(itemsplit[-2],itemsplit[-1])
          64    list = test.addr2line()
          65    print "%-30s%s" % (list[1],list[0])
          66
          posted on 2010-03-06 12:56 Xu Jianxiang 閱讀(3746) 評論(0)  編輯  收藏 所屬分類: Android
          主站蜘蛛池模板: 沾益县| 拜泉县| 锡林郭勒盟| 江门市| 泰和县| 富蕴县| 蒙城县| 陆良县| 襄城县| 永靖县| 藁城市| 新余市| 梓潼县| 营山县| 峨边| 若羌县| 吴堡县| 且末县| 南投市| 楚雄市| 岳池县| 中牟县| 渑池县| 太原市| 吉隆县| 会东县| 突泉县| 峨眉山市| 三明市| 中宁县| 图们市| 越西县| 津南区| 秭归县| 海晏县| 鸡西市| 浙江省| 阿城市| 汶川县| 蓬溪县| 临沂市|