Android下调试.so库类的bug

在android开发过程中,经常出现运行写的程序后机子立马死机,然后打了一堆不认识的log,如下所示:

[plain]  view plain copy
  1. I/DEBUG   (  161): Build fingerprint: 'unknown'  
  2. I/DEBUG   (  161): pid: 758, tid: 765  >>> com.oppo.wallpaper <<<  
  3. I/DEBUG   (  161): signal 11 (SIGSEGV), fault addr 49f23000  
  4. I/DEBUG   (  161):  r0 4a1ba240  r1 49f22ff8  r2 000006a0  r3 00000000  
  5. I/DEBUG   (  161):  r4 00000000  r5 00000000  r6 00000960  r7 00000001  
  6. I/DEBUG   (  161):  r8 00100000  r9 a9e169b5  10 49e23000  fp 49f22e48  
  7. I/DEBUG   (  161):  ip 80f09130  sp 49f22aa0  lr 80f02828  pc afd0f1ec  cpsr 20000010  
  8. I/DEBUG   (  161):  d0  643a64696f72646e  d1  6472656767756265  
  9. I/DEBUG   (  161):  d2  0000000000000000  d3  0000000000000000  
  10. I/DEBUG   (  161):  d4  0000000000000000  d5  0000000000000000  
  11. I/DEBUG   (  161):  d6  0000000000000000  d7  0000000000000000  
  12. I/DEBUG   (  161):  d8  0000000000000000  d9  0000000000000000  
  13. I/DEBUG   (  161):  d10 0000000000000000  d11 0000000000000000  
  14. I/DEBUG   (  161):  d12 0000000000000000  d13 0000000000000000  
  15. I/DEBUG   (  161):  d14 0000000000000000  d15 0000000000000000  
  16. I/DEBUG   (  161):  d16 0000000000000000  d17 beb1bcce06c829e8  
  17. I/DEBUG   (  161):  d18 bf29ff2fd6cab8b8  d19 3ec6cd878c3b46a7  
  18. I/DEBUG   (  161):  d20 bf6681d6ffb6f084  d21 3f3937f8a97fa389  
  19. I/DEBUG   (  161):  d22 3fcdee92c0000000  d23 3ef99342e0ee5069  
  20. I/DEBUG   (  161):  d24 3ef99342e0ee5069  d25 be3dd3baa0000000  
  21. I/DEBUG   (  161):  d26 be3dd3baa0000000  d27 3ef99342e0ee5069  
  22. I/DEBUG   (  161):  d28 0000000000000000  d29 0000000000000000  
  23. I/DEBUG   (  161):  d30 0000000000000000  d31 0000000000000000  
  24. I/DEBUG   (  161):  scr 80000013  
  25. I/DEBUG   (  161):   
  26. I/DEBUG   (  161):          #00  pc 0000f1ec  /system/lib/libc.so  
  27. I/DEBUG   (  161):          #01  pc 00002824  /system/lib/libgsl.so  
  28. I/DEBUG   (  161):          #02  pc 00088e8c  /system/lib/egl/libGLESv2_adreno200.so  
  29. I/DEBUG   (  161):          #03  pc 00090f94  /system/lib/egl/libGLESv2_adreno200.so  
  30. I/DEBUG   (  161):          #04  pc 0005f8e2  /system/lib/egl/libGLESv2_adreno200.so  
  31. I/DEBUG   (  161):          #05  pc 000623ca  /system/lib/egl/libGLESv2_adreno200.so  
  32. I/DEBUG   (  161):          #06  pc 00082622  /system/lib/egl/libGLESv2_adreno200.so  
  33. I/DEBUG   (  161):          #07  pc 00020772  /system/lib/libRS.so  
  34. I/DEBUG   (  161):          #08  pc 000207be  /system/lib/libRS.so  
  35. I/DEBUG   (  161):          #09  pc 0001f4dc  /system/lib/libRS.so  
  36. I/DEBUG   (  161):   
  37. I/DEBUG   (  161): code around pc:  
  38. I/DEBUG   (  161): afd0f1cc f5d1f000 f5d1f020 e2522040 3a000009   
  39. I/DEBUG   (  161): afd0f1dc f5d1f040 f5d1f060 f5d1f080 f421020d   
  40. I/DEBUG   (  161): afd0f1ec f421420d f5d1f080 e2522040 f400022d   
  41. I/DEBUG   (  161): afd0f1fc f400422d 2afffff8 e2822040 e2522020   
  42. I/DEBUG   (  161): afd0f20c 3a000003 f421020d e2522020 f400022d   
  43. I/DEBUG   (  161):   
  44. I/DEBUG   (  161): code around lr:  
  45. I/DEBUG   (  161): 80f02808 e5901008 e0836005 e1560001 8a000006   
  46. I/DEBUG   (  161): 80f02818 e5903000 e1a0100c e0830005 eb00099c   
  47. I/DEBUG   (  161): 80f02828 e1a00004 e28dd008 e8bd8070 e59f004c   
  48. I/DEBUG   (  161): 80f02838 e1a02005 e59fc048 e58d1000 e79e0000   
  49. I/DEBUG   (  161): 80f02848 e08e100c e28000a8 ebffff44 e3e00000   
  50. I/DEBUG   (  161):   
  51. I/DEBUG   (  161): stack:  
  52. I/DEBUG   (  161):     49f22a60  0028a9a0  [heap]  
  53. I/DEBUG   (  161):     49f22a64  002f0d68  [heap]  
  54. I/DEBUG   (  161):     49f22a68  00000004    
  55. I/DEBUG   (  161):     49f22a6c  81a5f8e7  /system/lib/egl/libGLESv2_adreno200.so  
  56. I/DEBUG   (  161):     49f22a70  00000000    
  57. I/DEBUG   (  161):     49f22a74  81b9b26c  /system/lib/egl/libGLESv2_adreno200.so  
  58. I/DEBUG   (  161):     49f22a78  00000000    
  59. I/DEBUG   (  161):     49f22a7c  afd102e4  /system/lib/libc.so  
  60. I/DEBUG   (  161):     49f22a80  afd4373c  /system/lib/libc.so  
  61. I/DEBUG   (  161):     49f22a84  00000050    
  62. I/DEBUG   (  161):     49f22a88  002f1170  [heap]  
  63. I/DEBUG   (  161):     49f22a8c  81bc8740  /system/lib/egl/libGLESv2_adreno200.so  
  64. I/DEBUG   (  161):     49f22a90  00100000  [heap]  
  65. I/DEBUG   (  161):     49f22a94  a9e169b5  /system/lib/libRS.so  
  66. I/DEBUG   (  161):     49f22a98  df002777    
  67. I/DEBUG   (  161):     49f22a9c  e3a070ad    
  68. I/DEBUG   (  161): #00 49f22aa0  4a1b9fc0  /dev/zero (deleted)  
  69. I/DEBUG   (  161):     49f22aa4  80f02828  /system/lib/libgsl.so  
  70. I/DEBUG   (  161): #01 49f22aa8  00281c40  [heap]  
  71. I/DEBUG   (  161):     49f22aac  00000960    
  72. I/DEBUG   (  161):     49f22ab0  002f1170  [heap]  
  73. I/DEBUG   (  161):     49f22ab4  0028a9a0  [heap]  
  74. I/DEBUG   (  161):     49f22ab8  002f118c  [heap]  
  75. I/DEBUG   (  161):     49f22abc  81a88e8f  /system/lib/egl/libGLESv2_adreno200.so  

咋一看,好多七七八八的数字,以及很多的.so库文件,其实这个就是程序运行过程中函数调用在堆栈中的地址信息,直接通过那些地址我们是无法得知错误出在哪里,不过我们可以有种方式直接告诉我们是在调用库文件里面的哪个函数处出了问题。具体如下:

1.首先取以上log信息中的从#00开始连续的那一部分,保存为error.txt(文档名可以随便取)

[plain]  view plain copy
  1. I/DEBUG   (  161):          #00  pc 0000f1ec  /system/lib/libc.so  
  2. I/DEBUG   (  161):          #01  pc 00002824  /system/lib/libgsl.so  
  3. I/DEBUG   (  161):          #02  pc 00088e8c  /system/lib/egl/libGLESv2_adreno200.so  
  4. I/DEBUG   (  161):          #03  pc 00090f94  /system/lib/egl/libGLESv2_adreno200.so  
  5. I/DEBUG   (  161):          #04  pc 0005f8e2  /system/lib/egl/libGLESv2_adreno200.so  
  6. I/DEBUG   (  161):          #05  pc 000623ca  /system/lib/egl/libGLESv2_adreno200.so  
  7. I/DEBUG   (  161):          #06  pc 00082622  /system/lib/egl/libGLESv2_adreno200.so  
  8. I/DEBUG   (  161):          #07  pc 00020772  /system/lib/libRS.so  
  9. I/DEBUG   (  161):          #08  pc 000207be  /system/lib/libRS.so  
  10. I/DEBUG   (  161):          #09  pc 0001f4dc  /system/lib/libRS.so  
2.将该txt文档和我附录给的hy.panic.py文件都拷入到android源码的根目录下,之后修改hy.panic.py中的ANDROID_PRODUCT_NAME 为你目前的手机固件名

3.在linux终端中进入源码根目录,然后执行./hy.panic.py  error.txt,完了就会显示在哪个文件的哪行代码调用出问题 ,注意第一个点后面没有空格

有时运行后会出现如下错误:

[plain]  view plain copy
  1. read file ok  
  2. /home/android/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-addr2line: '/home/android/out/target/product/msm7630_surf/symbols/system/lib/libRS.so': No such file  
  3. Traceback (most recent call last):  
  4.   File "./hy.panic.py", line 64, in   
  5.     print "%-30s%s" % (list[1],list[0])  
  6. IndexError: list index out of range  

此时只需到 /home/android/out/target/product/msm7630_surf/system/lib/下面把libRS.so文件拷贝到 /home/android/out/target/product/msm7630_surf/symbols/system/lib/下面再重新运行即可出现结果

附录:hy.panic.py:


[cpp]  view plain copy
  1. #!/usr/bin/python  
  2. # stack symbol parser  
  3. import os  
  4. import string  
  5. import sys  
  6.   
  7. #define android product name  
  8. ANDROID_PRODUCT_NAME = 'msm7630_surf'  
  9.   
  10. ANDROID_WORKSPACE = os.getcwd()+"/"  
  11.   
  12. # addr2line tool path and symbol path  
  13. addr2line_tool = ANDROID_WORKSPACE + 'prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-addr2line'  
  14. symbol_dir = ANDROID_WORKSPACE + 'out/target/product/' + ANDROID_PRODUCT_NAME +'/symbols'  
  15. symbol_bin = symbol_dir + '/system/bin/'  
  16. symbol_lib = symbol_dir + '/system/lib/'  
  17.   
  18.   
  19. class ReadLog:  
  20.     def __init__(self,filename):  
  21.         self.logname = filename  
  22.     def parse(self):  
  23.         f = file(self.logname,'r')  
  24.         lines = f.readlines()  
  25.         if lines != []:  
  26.             print 'read file ok'  
  27.         else:  
  28.             print 'read file failed'  
  29.         result =[]  
  30.         for line in lines:  
  31.             if line.find('stack') != -1:  
  32.                 print 'stop search'  
  33.                 break  
  34.             elif line.find('system') != -1:  
  35.                 #print 'find one item' + line  
  36.                 result.append(line)  
  37.         return result  
  38.   
  39. class ParseContent:  
  40.     def __init__(self,addr,lib):  
  41.             self.address = addr # pc address  
  42.             self.exename = lib  # executable or shared library  
  43.     def addr2line(self):  
  44.         cmd = addr2line_tool + " -C -f -s -e " + symbol_dir + self.exename + " " + self.address  
  45.         #print cmd  
  46.         stream = os.popen(cmd)  
  47.         lines = stream.readlines();  
  48.         list = map(string.strip,lines)  
  49.         return list  
  50.       
  51. inputarg = sys.argv  
  52. if len(inputarg) < 2:  
  53.     print 'Please input panic log'  
  54.     exit()  
  55.   
  56. filename = inputarg[1]  
  57. readlog = ReadLog(filename)  
  58. inputlist = readlog.parse()  
  59.   
  60. for item in inputlist:  
  61.     itemsplit = item.split()  
  62.     test = ParseContent(itemsplit[-2],itemsplit[-1])  
  63.     list = test.addr2line()  
  64.     print "%-30s%s" % (list[1],list[0])  

你可能感兴趣的:(Android,开发及核心技术)