android hwui内存越界分析

android内存检查工具:

1. address-sanitizer

速度比较快,app运行速度降低2x。由于实现机制的问题需要编译器支持,使用的不是gcc编译器,所以代码编译很容易出现错误。

2. valgrind

速度比较慢,app运行速度降低10x

3. bionic中libc的内存检测选项

功能没有前两者强大,只支持malloc内存的越界写,malloc和free不匹配,同块内存多次free的检测。


在这个case下:

1.使用address-sanitizer hwui编译出现问题。

2. valgrind能使用,但是无法复现crash。


所以使用bionic中libc的内存检测选项来debug这次内存越界。

工作原理:

每次通过malloc函数分配的内存都会在内存的头上和尾巴上加入guard字符。分别称为front guard和rear guard。

当free的时候,就会检测front guard和rear guard的数据是不是和分配的时候设置的一样。如果不一样就表明发生了内存越界写的情况,会把分配这块内存的backtrace打出来。


debug步骤:

1. adb shell setprop libc.debug.malloc 10

2. adb shell stop

3. adb shell start 


得到如下log:

01-01 08:12:39.840  3881  3881 E libc    : +++ REAR GUARD MISMATCH [10, 15)
01-01 08:12:39.840  3881  3881 E libc    : +++ ALLOCATION 0x5a202270 SIZE 7488 HAS A CORRUPTED REAR GUARD
01-01 08:12:39.840  3881  3881 E libc    : +++ ALLOCATION 0x5a202270 SIZE 7488 ALLOCATED HERE:
01-01 08:12:39.840  3881  3881 E libc    : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-01 08:12:39.840  3881  3881 E libc    :           #00  pc 0000d7ac  /system/lib/libc_malloc_debug_leak.so (chk_memalign+0x69)
01-01 08:12:39.840  3881  3881 E libc    :           #01  pc 0000e37a  /system/lib/libc.so (memalign+0x9)
01-01 08:12:39.850  3881  3881 E libc    :           #02  pc 00010a80  /system/lib/libhwui.so
01-01 08:12:39.850  3881  3881 E libc    :           #03  pc 0002bf0c  /system/lib/libhwui.so
01-01 08:12:39.850  3881  3881 E libc    :           #04  pc 0001f632  /system/lib/libhwui.so
01-01 08:12:39.850  3881  3881 E libc    :           #05  pc 00021166  /system/lib/libhwui.so
01-01 08:12:39.850  3881  3881 E libc    :           #06  pc 00016bae  /system/lib/libhwui.so
01-01 08:12:39.850  3881  3881 E libc    :           #07  pc 00014704  /system/lib/libhwui.so
01-01 08:12:39.850  3881  3881 E libc    :           #08  pc 000145f2  /system/lib/libhwui.so
01-01 08:12:39.850  3881  3881 E libc    :           #09  pc 0001d34c  /system/lib/libhwui.so
01-01 08:12:39.850  3881  3881 E libc    :           #10  pc 0006bdf0  /system/lib/libandroid_runtime.so
01-01 08:12:39.850  3881  3881 E libc    :           #11  pc 41623d4c  libdvm.so (dvmPlatformInvoke+0x70)
01-01 08:12:39.850  3881  3881 E libc    :           #12  pc 41653fc6  libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+0x189)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值