Android 调试.so库文件

作者:徐建祥(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
 4 import  os
 5 import  string
 6 import  sys
 7
 8 # define android product name
 9 # ANDROID_PRODUCT_NAME = 'generic'
10 ANDROID_PRODUCT_NAME  =   ' smdk6410 '
11
12 ANDROID_WORKSPACE  =  os.getcwd() + " / "
13
14 #  addr2line tool path and symbol path
15 addr2line_tool  =  ANDROID_WORKSPACE  +   ' prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-addr2line '
16 symbol_dir  =  ANDROID_WORKSPACE  +   ' out/target/product/ '   +  ANDROID_PRODUCT_NAME  + ' /symbols '
17 symbol_bin  =  symbol_dir  +   ' /system/bin/ '
18 symbol_lib  =  symbol_dir  +   ' /system/lib/ '
19
20 class  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
40 class  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     
52 inputarg  =  sys.argv
53 if  len(inputarg)  <   2 :
54      print   ' Please input panic log '
55     exit()
56
57 filename  =  inputarg[ 1 ]
58 readlog  =  ReadLog(filename)
59 inputlist  =  readlog.parse()
60
61 for  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
  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值