现在的位置: 首页 > 综合 > 正文

采用调用链或者函数符号表来定位crash位置

2013年05月19日 ⁄ 综合 ⁄ 共 2207字 ⁄ 字号 评论关闭

采用调用链或者函数符号表来定位crash位置

android 应用程序开发及调试过程中,单步调试仍然不是很方便。由于依托java层,jni层的源代码要以动态库形式装载。

但是好在程序crash时,log中会抛出断点信息。

**********************************************************************************************

补充断点信息

02-10 20:47:54.126: I/DEBUG(2370): Build fingerprint: 'samsung/SCH-iXXXX/SCH-iXXXXX/SCH-iXXXX:2.XXX/FROYO/ED29:user/release-keys'
02-10 20:47:54.126: I/DEBUG(2370): pid: 4398, tid: 4402  >>> /system/bin/mediaserver <<<
02-10 20:47:54.126: I/DEBUG(2370): signal 11 (SIGSEGV), fault addr deadbaad
02-10 20:47:54.126: I/DEBUG(2370):  r0 00000000  r1 afd14921  r2 00000027  r3 00000070
02-10 20:47:54.126: I/DEBUG(2370):  r4 afd42328  r5 00000000  r6 00000000  r7 ffffee07
02-10 20:47:54.126: I/DEBUG(2370):  r8 00100000  r9 a811c479  10 4031f000  fp 0002cef8
02-10 20:47:54.126: I/DEBUG(2370):  ip 00001730  sp 4041e8b0  lr deadbaad  pc afd11f74  cpsr 60000030
02-10 20:47:54.126: I/DEBUG(2370):  d0  643a64696f72646e  d1  6472656767756265
02-10 20:47:54.126: I/DEBUG(2370):  d2  6f6365446d28203d  d3  6874646957646564
02-10 20:47:54.126: I/DEBUG(2370):  d4  6f63726f6c6f632f  d5  6e6f69737265766e

 

02-10 20:47:54.227: I/DEBUG(2370):          #00  pc 00011f74  /system/lib/libc.so
02-10 20:47:54.227: I/DEBUG(2370):          #01  pc 0000138e  /system/lib/liblog.so
02-10 20:47:54.227: I/DEBUG(2370):          #02  pc 000013f0  /system/lib/libjin-1.so
02-10 20:47:54.227: I/DEBUG(2370):          #03  pc 00001522  /system/lib/libjni-2.so
02-10 20:47:54.231: I/DEBUG(2370):          #04  pc 00008e1c  /system/lib/libxxxxxxx.so
02-10 20:47:54.231: I/DEBUG(2370):          #05  pc 0003920c  /system/lib/libmedia.so

**********************************************************************************************

此时要注意,不要找系统库的问题,要找就找你自己编译的库。 像#02,#03的。

此时定位库的出问题的函数的位置一般只能依靠两种方法。假若动态库为jni-1.so,jni-2.so

 

方法1,若库在编译时为NO_DEBUG版本,即不含有DEBUG信息(NDK_DEBUG=0),这种情况下,可以用

obj-dump -T  jni-1.so

obj-dump -T jni-2.so

的方法,将函数符号表打印出来,这样可以得到每个函数的入口地址。

结合log 中的crash信息,我们可以粗略定位,问题出在哪个函数里面。

但是这种方法找不到精确的出问题的位置,有时候函数比较长时,在函数里面进一步判断出问题的地方也比较麻烦。

此时可采用第二种方法

方法2,编译库的时候,采用DEBUG版本,即含有DEBUG信息(NDK_DEBUG=1),这种情况下。

我们可以把crash的信息复制下来,放在记事本里面,命名为crash.log.txt,将此记事本放在android工程的libs/armeabi/目录下,当然也可以是libs/armeabi-v7a

/cygdrive/e/Software/android-ndk-r6b/ndk-stack -sym obj/local/armeabi-v7a/ -dump e:/logs/crash.log.txt
中间一项也可以是  -sym libs/armeabi-v7a/ 反正就是你的动态库的位置。

这样会打印出具体的出问题的代码位置,这样一般可以精确到行。

 

 

 

 

抱歉!评论已关闭.