• 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里面的值一样不一样,有时间验证一下。我猜是这样的^_^

  • 相关阅读:
    docker 学习
    Postman通过登录接口返回的token,然后请求其他接口时在header头中带上token信息
    c语言字符串常量赋值(多个双引号字符串常量组合成一个字符串常量)
    KEA之FTM、PWM
    SQL SERVER LEFT JOIN
    SQL SERVEL 合并表之间列
    C#时间操作帮助
    docker 安装 mysql
    python pip配置国内镜像
    python安装tensorflow
  • 原文地址:https://www.cnblogs.com/chyl411/p/3484322.html
Copyright © 2020-2023  润新知