跳到主要内容

使用HWASan检测内存错误

HWASan(Hardware-Assisted Address Sanitizer)是一款类似于ASan的内存错误检测工具。 与ASan相比,HWASan使用的内存减少很多,因而更适合用于整个系统的检测。关于HWASan的检测原理请参考HWASan检测原理

约束条件

  • HWASan检测仅适用于AArch64架构的硬件。
  • ASan、TSan、UBSan、HWASan不能同时开启,只能开启其中一个。

开启HWASan

DevEco Studio 6.1.0 Beta1之前的版本,仅支持对C++源码开启HWASan。

从DevEco Studio 6.1.0 Beta1版本开始,同时支持对C++编译生成的无源码so文件进行二进制插桩,进而开启HWASan功能。

方式一

  1. 点击Run > Edit Configurations > Diagnostics,勾选Hardware-Assisted Address Sanitizer开启C++源码检测插桩。

    从DevEco Studio 6.1.0 Beta1版本开始,可以同时勾选BinXO check,开启无源码的so文件的HWASan检测插桩。

  2. (可选)如果部分无源码so不需要进行HWASan检测插桩,可以在工程级或模块级build-profile.json5文件中,配置excludeSoFromBinXO字段,填写需要忽略的so列表,支持正则匹配。

    "buildOption": {
    "nativeLib": {
    "excludeSoFromBinXO": ["**/liblibrary.so"]
    }
    }

方式二

  1. 修改工程目录下的AppScope/app.json5文件,添加HWASan配置开关。

    "hwasanEnabled": true

  2. 在需要开启HWASan的模块级build-profile.json5中,添加构建参数开启HWASan检测插桩。

    // DevEco Studio 6.1.0 Beta1以下版本
    "buildOption": {
    "externalNativeOptions": {
    "arguments": ["-DOHOS_ENABLE_HWASAN=ON"]
    }
    // DevEco Studio 6.1.0 Beta1及以上版本,同时开启有源码和无源码的C++的HWASan检测插桩
    "buildOption": {
    "externalNativeOptions": {
    "arguments": ["-DOHOS_ENABLE_HWASAN=ON", "-DOHOS_ENABLE_BINXO=ON"]
    }
  3. 如果部分无源码so不需要进行HWASan检测插桩,可以在工程级或模块级build-profile.json5文件中,配置excludeSoFromBinXO字段,填写需要忽略的so列表,支持正则匹配。

    "buildOption": {
    "nativeLib": {
    "excludeSoFromBinXO": ["**/liblibrary.so"]
    }
    }

使用HWASan

  1. 运行或调试当前应用。

  2. 当程序出现内存错误时,弹出HWASan log信息,点击信息中的链接即可跳转至引起内存错误的代码处。日志中各字段的说明请参考HWASan日志规格,异常检测类型请参考HWASan异常检测类型

  3. 如果是release应用,本地无工程代码,可以使用AnalyzeStackTrace功能,提供要解析堆栈的so,解析结果为源码地址。