How to use asan to debug native memory bugs?
AddressSanitizer (ASan)是Google开发的一款用于检查Native内存错误的工具,类似于Valgrind。其官网介绍如下:
AddressSanitizer (ASan) is a fast compiler-based tool for detecting memory bugs in native code. It is comparable to Valgrind (Memcheck tool), but, unlike it, ASan:
|
---|
经实际确认,目前在我们Android project上可以有如下两种使用方式:
1. Enable AddressSanitizer for all apps:
这种方式修改相对简单,只需要做如下两部分修改:
In frameworks/base/cmds/app_process/Android.mk add
“LOCAL_SANITIZE:=address”
In system/core/rootdir/init.zygote(32|64).rc to add the following lines:
setenv LD_LIBRARY_PATH=/system/lib/asan:/system/libs
setenv ASAN_OPTIONS alloc_dealloc_mismatch=0:allow_user_segv_handler=true
这样修改后,就可以利用ASan来同时检测所有APP的native memory bugs, 但有利有弊,这种方式也有一定的弊端:
- System is very slow because ASan is enabled in all the apps.
- LMK are seen often.
2. Enable AddressSanitizer for specific APP or Java Process:
Google官网上有介绍,我们也可以只对某个特定的APP来enable ASan, 其使用的方式是设定wrap.<package_name> property的方式,这样就可以利用property中所指定的程序来启动相应的应用程序或进程。
但是我们目前拿到的Android N AOSP这一部分存在bug,设定wrap.<package_name> property后会导致系统crash, 关于这点,需要从Master branch sync如下这笔改动:
https://android-review.googlesource.com/#/c/platform/frameworks/base/+/318859
1) How to enable ASan for some APPs or Java processes:
- Runtime阶段设定Property的方式:
setprop wrap.com.google.android.gm "asanwrapper"
- 以下几种情况通过 设定Property的方式并不合适:
- 需要在boot阶段就来检测某个APP或Java Process的内存问题;
- package_name/process_name中含有无效字符,例如setprop: invalid character ':';
- wrap.<package_name/process_name>的长度大于31.