android stack-trace分析

.so里面crash掉了,日志有这样的:

01-05 08:01:00.215: I/DEBUG(86): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-05 08:01:00.215: I/DEBUG(86): Build fingerprint: 'alps/eidolon15_gb2/eidolon15_gb2:2.3.6/GRK39F/1346656059:eng/test-keys'
01-05 08:01:00.215: I/DEBUG(86): pid: 15641, tid: 15641 >>> cookbook.chapter2 <<<
01-05 08:01:00.215: I/DEBUG(86): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
01-05 08:01:00.215: I/DEBUG(86): r0 00000027 r1 deadbaad r2 a0000000 r3 00000000
01-05 08:01:00.215: I/DEBUG(86): r4 00000001 r5 bed7a844 r6 bed7a970 r7 429a2c9c
01-05 08:01:00.215: I/DEBUG(86): r8 bed7a8a0 r9 429a2c94 10 0000ae70 fp bed7a89c
01-05 08:01:00.215: I/DEBUG(86): ip afd496e8 sp bed7a830 lr afd1c081 pc afd187ce cpsr 20000030
01-05 08:01:00.258: I/DEBUG(86): #00 pc 000187ce /system/lib/libc.so
01-05 08:01:00.258: I/DEBUG(86): #01 pc 0001f7d4 /system/lib/libc.so
01-05 08:01:00.258: I/DEBUG(86): #02 pc 00000e8c /data/data/cookbook.chapter2/lib/libmyFirstLib.so
01-05 08:01:00.259: I/DEBUG(86): #03 pc 0000e874 /system/lib/libdvm.so
01-05 08:01:00.259: I/DEBUG(86): #04 pc 0003e49a /system/lib/libdvm.so
01-05 08:01:00.259: I/DEBUG(86): #05 pc 000439a2 /system/lib/libdvm.so
01-05 08:01:00.260: I/DEBUG(86): #06 pc 0001f8dc /system/lib/libdvm.so
01-05 08:01:00.260: I/DEBUG(86): code around pc:
01-05 08:01:00.260: I/DEBUG(86): afd187ac 4623b16c 2c006824 e028d1fb b13368db
01-05 08:01:00.260: I/DEBUG(86): afd187bc c064f8df 44fc2401 4000f8cc 49124798
01-05 08:01:00.260: I/DEBUG(86): afd187cc 70082027 f7f22500 2106ef46 e882f7f4
01-05 08:01:00.260: I/DEBUG(86): afd187dc 2006a901 f04f460a 95015380 95029303
01-05 08:01:00.260: I/DEBUG(86): afd187ec ec08f7f3 462aa905 f7f32002 f7f2ec14
01-05 08:01:00.260: I/DEBUG(86): code around lr:
01-05 08:01:00.261: I/DEBUG(86): afd1c060 41f0e92d 4a0d4b0c 4680447b 2600589c
01-05 08:01:00.261: I/DEBUG(86): afd1c070 686768a5 f9b5e006 b113300c 47c04628
01-05 08:01:00.261: I/DEBUG(86): afd1c080 35544306 37fff117 6824d5f5 d1ef2c00
01-05 08:01:00.261: I/DEBUG(86): afd1c090 e8bd4630 bf0081f0 000284b8 ffffff8c
01-05 08:01:00.261: I/DEBUG(86): afd1c0a0 fb01b570 b086f602 9004460c a804a901
01-05 08:01:00.262: I/DEBUG(86): stack:
01-05 08:01:00.262: I/DEBUG(86): bed7a7f0 afd456ec
01-05 08:01:00.262: I/DEBUG(86): bed7a7f4 000a39a8
01-05 08:01:00.262: I/DEBUG(86): bed7a7f8 00000015
01-05 08:01:00.262: I/DEBUG(86): bed7a7fc afd1b149 /system/lib/libc.so
01-05 08:01:00.262: I/DEBUG(86): bed7a800 afd45794
01-05 08:01:00.262: I/DEBUG(86): bed7a804 afd45740
01-05 08:01:00.262: I/DEBUG(86): bed7a808 00000000
01-05 08:01:00.262: I/DEBUG(86): bed7a80c afd1c081 /system/lib/libc.so
01-05 08:01:00.262: I/DEBUG(86): bed7a810 00000001
01-05 08:01:00.263: I/DEBUG(86): bed7a814 bed7a844
01-05 08:01:00.263: I/DEBUG(86): bed7a818 bed7a970
01-05 08:01:00.263: I/DEBUG(86): bed7a81c 429a2c9c
01-05 08:01:00.263: I/DEBUG(86): bed7a820 bed7a8a0
01-05 08:01:00.263: I/DEBUG(86): bed7a824 afd1b3a3 /system/lib/libc.so
01-05 08:01:00.263: I/DEBUG(86): bed7a828 df002777
01-05 08:01:00.263: I/DEBUG(86): bed7a82c e3a070ad
01-05 08:01:00.264: I/DEBUG(86): #00 bed7a830 429a2c94
01-05 08:01:00.264: I/DEBUG(86): bed7a834 0000ae70
01-05 08:01:00.264: I/DEBUG(86): bed7a838 bed7a89c
01-05 08:01:00.264: I/DEBUG(86): bed7a83c afd1b6c9 /system/lib/libc.so
01-05 08:01:00.264: I/DEBUG(86): bed7a840 afd45740
01-05 08:01:00.264: I/DEBUG(86): bed7a844 fffffbdf
01-05 08:01:00.264: I/DEBUG(86): bed7a848 afd1f7d5 /system/lib/libc.so
01-05 08:01:00.265: I/DEBUG(86): bed7a84c afd3dc80 /system/lib/libc.so
01-05 08:01:00.265: I/DEBUG(86): bed7a850 82b02338 /data/data/cookbook.chapter2/lib/libmyFirstLib.so
01-05 08:01:00.265: I/DEBUG(86): bed7a854 afd1f7d9 /system/lib/libc.so
01-05 08:01:00.265: I/DEBUG(86): #01 bed7a858 00000021
01-05 08:01:00.265: I/DEBUG(86): bed7a85c 82b02350 /data/data/cookbook.chapter2/lib/libmyFirstLib.so
01-05 08:01:00.266: I/DEBUG(86): bed7a860 82b02350 /data/data/cookbook.chapter2/lib/libmyFirstLib.so
01-05 08:01:00.266: I/DEBUG(86): bed7a864 bed7a8c0
01-05 08:01:00.266: I/DEBUG(86): bed7a868 00000004
01-05 08:01:00.266: I/DEBUG(86): bed7a86c 82b00e90 /data/data/cookbook.chapter2/lib/libmyFirstLib.so

完全看不懂啊。。。

网上说,临死前的PC指针call stack 是这样的

#00 pc 000187ce /system/lib/libc.so
#01 pc 0001f7d4 /system/lib/libc.so
#02 pc 00000e8c /data/data/cookbook.chapter2/lib/libmyFirstLib.so
#03 pc 0000e874 /system/lib/libdvm.so
#04 pc 0003e49a /system/lib/libdvm.so
#05 pc 000439a2 /system/lib/libdvm.so
#06 pc 0001f8dc /system/lib/libdvm.so

好吧,使用IDA反编译这些库,然后看pc的地址,是在libmyFirstLib.so里面出问题了,找到对应地址的代码00000e8c。可以找到相应的函数名。

如下:

00000e8c就在这个函数里面。好吧,这很简单,不是重点。这个信息量会不会太小了,没关系

trace 里面有这样的stack信息:

01-05 08:01:00.265: I/DEBUG(86): bed7a850 82b02338 /data/data/cookbook.chapter2/lib/libmyFirstLib.so
01-05 08:01:00.265: I/DEBUG(86): bed7a854 afd1f7d9 /system/lib/libc.so
01-05 08:01:00.265: I/DEBUG(86): #01 bed7a858 00000021
01-05 08:01:00.265: I/DEBUG(86): bed7a85c 82b02350 /data/data/cookbook.chapter2/lib/libmyFirstLib.so
01-05 08:01:00.266: I/DEBUG(86): bed7a860 82b02350 /data/data/cookbook.chapter2/lib/libmyFirstLib.so
01-05 08:01:00.266: I/DEBUG(86): bed7a864 bed7a8c0
01-05 08:01:00.266: I/DEBUG(86): bed7a868 00000004
01-05 08:01:00.266: I/DEBUG(86): bed7a86c 82b00e90 /data/data/cookbook.chapter2/lib/libmyFirstLib.so

libmyFirstLib.so对应的还有0x82b02350这种地址呢,该怎么阅读呢。。。。我们知道动态库在内存中的加载地址是不固定的,ida反编译的时候默认是以0x00000000为起始加载地址的。显然,0x82b02350这种地址是虚拟地址,怎么搞。好吧,我们应该找出这个程序里的libmyFirstLib.so被加载到哪里了。

>adb shell

#ps 

....

app_41 16275 89 111880 17800 ffffffff afd0c7f8 S cookbook.chapter2

....

#先找出我们的程序的进程ID为16275。

# cat /proc/16275/maps

有这样的输出

可以看到libmyFirstLib.so的加载地址是82b00000-82b03000。r-xp是什么意思?我猜可能是只读的代码段吧,rw-p可能是数据段吧。这个先不管。

0x82b02350这种地址就可以解析了,用0x82b02350 - 0x82b00000 = 0x2350。这就是ida里面的偏移地址了。可以用ndk-gdb 里面的x命令看一下内存里的值和IDA里面的值一样不一样,有时间验证一下。我猜是这样的^_^

posted on 2013-12-20 18:00  各各他  阅读(993)  评论(0编辑  收藏  举报

导航