内存问题的排查工具和方法– Clang的AddressSanitizer

AddressSanitizer(ASan)是Google开发的用于检查内存错误的工具,类似Valgrind。本文介绍了如何在Android项目中启用ASan,包括全局启用和针对特定APP启用,并给出了示例代码和内存泄漏检测的说明。ASan可以检测内存越界、释放后使用等问题,但也存在程序运行慢和不支持静态编译等缺陷。
摘要由CSDN通过智能技术生成

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:

  • + detects overflows on stack and global objects
  • - does not detect uninitialized reads and memory leaks
  • + is much faster (two-three times slowdown compared to Valgrind’s 20-100x)
  • + has less memory overhead

经实际确认,目前在我们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.
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值