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)