高通车机8155平台android开启ASAN定位内存问题方法

前言

高通8155平台有自己的客制化,仅按照google的描述在编译命令里面加上-fsanitize=address是不能够编译出来带ASAN的bin或者SO。还需要更多的编译属性配置。

一、system分区模块打开ASAN

修改自己对应模块bin以及shared libs 的Android.bp 

1. 针对Android.bp情形

Android.bp 的cflags 里面添加 :

 "-Wno-error", "-fno-omit-frame-pointer", "-O0", "-Wno-frame-larger-than="

Android.bp 申明属性 :

clang: true  sanitize: {address: true,}

示例如下:

cc_defaults {
    name: "asan_debugd_defaults",
    cflags: [
        "-Werror",
        "-Wall",
        //enable asan related cflags begin
        "-Wno-error",
        "-fno-omit-frame-pointer",
        "-O0",
        "-Wno-frame-larger-than=",
        //enable asan related cflags end
    ],
     
    clang: true,  //ASAN related property
    sanitize: {address: true,}, //ASAN option
 
    cppflags: [
        "-Wnon-virtual-dtor",
        "-fno-strict-aliasing",
    ],
    ldflags: [
        "-Wl",
    ],
}
 
 
cc_binary {
    name: "asan_debugd",
    defaults: ["asan_debugd_defaults"],
    static_libs: [ "libAsanDebug",],
    shared_libs: [ "liblog", "libutils", "libcutils"],
    srcs: ["asan_debugd.cpp"],
}

注意,如果bin开启了ASAN,则bin的static libraries 都默认开启ASAN。而shared libraries 不会感染编译配置。所以可疑的shared libs 也要加。

2, 针对Android.mk情形

Android.mk需要打开如下属性:

LOCAL_CFLAGS += -fno-omit-frame-pointer -O0 -Wno-frame-larger-than= -fsanitize=address

LOCAL_CLANG := true

LOCAL_SHARED_LIBRARIES +=libclang_rt.asan-aarch64-android

其中LOCAL_SHARED_LIBRARIES 所申明的.so,在/system/lib64/里面有,在/system/lib/里面的so叫另外一个名字libclang_rt.asan-arm-android.so, 所以最好仅编译64位版本。只要能复现问题,不必32、64位都要编译。

示例(仅演示64位)如下:

LOCAL_PATH := $(call my-dir)
 
################################### /system/bin/asan_debugd ############################################
 
include $(CLEAR_VARS)
LOCAL_MODULE := asan_debugd
 
LOCAL_CFLAGS := -Werror
 
LOCAL_LDFLAGS += -Wl
 
LOCAL_CPPFLAGS += -Wfloat-equal -Wformat=2 -Wshadow -fstack-protector-all
 
LOCAL_MODULE_TAGS := optional
 
LOCAL_MULTILIB :=64
 
LOCAL_SRC_FILES += asan_debugd.cpp
 
LOCAL_C_INCLUDES := $(LOCAL_PATH)
 
LOCAL_SHARED_LIBRARIES := liblog libutils libcutils \
                          libAsanDebug
 
#LOCAL_STATIC_LIBRARIES :=  libAsanDebug
 
#asan related cflags
LOCAL_CFLAGS += -fno-omit-frame-pointer  -O0 -Wno-frame-larger-than=  -fsanitize=address
LOCAL_CLANG := true
LOCAL_SHARED_LIBRARIES +=libclang_rt.asan-aarch64-android
 
include $(BUILD_EXECUTABLE)

二,vendor分区打开ASAN

1, 预编译ASAN库

vendor空间所开启的编译命令与上述类似。但是有个问题,在/vendor/lib64/里面没有libclang_rt.asan-aarch64-android.so,所以需要把/system/lib64/里面的libclang_rt.asan-aarch64-android.so 预编译到/vendor/lib64.

如果不会写预编译的Android.mk 可以点击下面链接下载,预编译的lib以及Android.mk我都整理号了:

高通8155p平台QNX+Android9开启ASAN定位内存问题方法Android.mk与Android.bp都有_高通8155资源-CSDN文库

上述文件夹下载好了,放到能够编译到的地方即可。然后修改自己模块的Android.mk或者Android.bp 以下假设我预编译到vendor/lib(64)的.so改名叫做libclang_rt.asan-android_vnd.so

为了方便大家调试,我把32、64位的.so都编译进去了。并且各位的Android.bp不用再声明32或者64了。 

2,vendor分区Android.bp

cc_defaults {
    name: "asan_debuglib_defaults_vnd",
    cflags: [
        "-Werror",
        "-Wall",
        "-Wno-error",                 // asan related cflags
        "-fno-omit-frame-pointer",    // asan related cflags
        "-O0",                        //  asan related cflags
        "-Wno-frame-larger-than="     // asan related cflags
    ],
    cppflags: [
        "-Wnon-virtual-dtor",
        "-fno-strict-aliasing",
    ],
    ldflags: [
        "-Wl",
    ],

    shared_libs: [ "liblog", "libutils", "libcutils", 
        "libclang_rt.asan-android_vnd",
    ],
    clang: true, // asan related cflags
    sanitize: {address: true,}, // asan related cflags
    compile_multilib: "64",
}

// vendor/lib64/libAsanDebug_vnd

cc_library_shared {
    name: "libAsanDebug_vnd",
    vendor: true,  //vendor partition
    defaults: ["asan_debuglib_defaults_vnd"],
    static_libs: [
    ],
    export_include_dirs: ["export_headers", ],
    srcs: ["AsanDebug.cpp"],
}

3,vendor分区Android.mk

LOCAL_PATH := $(call my-dir)

##################################### /vendor/lib64/libAsanDebug_vnd #################################

include $(CLEAR_VARS)
LOCAL_MODULE := libAsanDebug_vnd

LOCAL_CFLAGS := -Werror

LOCAL_LDFLAGS += -Wl

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES +=  AsanDebug.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH) \
                    $(LOCAL_PATH)/export_headers


LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/export_headers


#ifeq (1,$(filter 1,$(shell echo "$$(( $(PLATFORM_SDK_VERSION) >= 26 ))" )))
LOCAL_PROPRIETARY_MODULE := true
#endif

LOCAL_SHARED_LIBRARIES :=liblog libutils libcutils

#asan related configure begin
LOCAL_CFLAGS += -
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值