使用ASan检测内存错误
============

为追求C/C++的极致性能，编译器和OS(Windows/Linux/Mac)运行框架不会对内存操作进行安全检测。针对该场景，DevEco Studio集成ASan（Address-Sanitizer）为开发者提供面向C/C++的地址越界检测能力，并通过FaultLog展示错误的堆栈详情及导致错误的代码行。关于ASan的检测原理请参考[ASan检测原理](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-stability-address-sanitizer-principle#section159561141247)。

#### 使用约束

*   如果应用内的任一模块开启ASan，那么entry模块需同时开启ASan。如果entry模块未开启ASan，该应用在启动时将闪退，出现CPP Crash报错。
*   ASan、TSan、UBSan、HWASan不能同时开启，只能开启其中一个。

#### 开启ASan

可通过以下两种方式开启ASan。

#### \[h2\]方式一

1.  点击**Run > Edit Configurations >** **Diagnostics**，勾选**Address Sanitizer**。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/c6/v3/Rwz4rsQyT0Wn5x2gCL6LmA/zh-cn_image_0000002594634656.png?HW-CC-KV=V1&HW-CC-Date=20260612T073902Z&HW-CC-Expire=86400&HW-CC-Sign=E9443EF4F727064934F796C2A6699E9BEC1AF90659112F3BF071138BBCAC90B2)
    
2.  如果有引用本地library，需在library模块的build-profile.json5文件中，配置arguments字段值为“-DOHOS\_ENABLE\_ASAN=ON”，表示以ASan模式编译so文件。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/e7/v3/5JFTuzf7ToenJDQwTe7tKg/zh-cn_image_0000002594634658.png?HW-CC-KV=V1&HW-CC-Date=20260612T073902Z&HW-CC-Expire=86400&HW-CC-Sign=0FBF003166312D2468F5C3060ADA34DA8DA5516175CC8636ED1C6430AA4669D5)
    

#### \[h2\]方式二

1.  修改工程目录下AppScope/app.json5，添加ASan配置开关。
    
     "asanEnabled": true
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/2d/v3/QanB3ygDRhGdPoekWYo4jQ/zh-cn_image_0000002594474736.png?HW-CC-KV=V1&HW-CC-Date=20260612T073902Z&HW-CC-Expire=86400&HW-CC-Sign=0D7F598E2761BB7EBF000ED7FF7D4418EE124E6EB8B03FBBAE66663D720C2F50)
    
2.  设置模块级构建ASan插桩。
    
    在需要开启ASan的模块中，通过添加构建参数开启ASan检测插桩，在对应模块的模块级build-profile.json5中添加命令参数：
    
    "arguments": "-DOHOS\_ENABLE\_ASAN=ON"
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/49/v3/C4EhWNFRSn2XpfplgQMuJw/zh-cn_image_0000002594474734.png?HW-CC-KV=V1&HW-CC-Date=20260612T073902Z&HW-CC-Expire=86400&HW-CC-Sign=166EF160EC1DB063C387E4A3ADC6134711F690185E899C47C844E02F0317FCFF)
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/f0/v3/jwkY5-ErSzeS6SzOtFp_ow/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073902Z&HW-CC-Expire=86400&HW-CC-Sign=8136AB2C2782EB2A505ED730BCD0ECAF3DAA519CC6F128E74EC2EB7F9A5F314B)
    
    该参数未配置不会报错，但是除包含malloc和free函数等少数内存错误外，出现其他需要插桩检测的内存错误时，ASan无法检测到错误。
    

#### 配置参数（可选）

ASAN\_OPTIONS用于在运行时配置ASan的行为，包括设置检测级别、输出格式、内存错误报告的详细程度等。ASAN\_OPTIONS支持在app.json5中配置，也支持在Run/Debug Configurations中配置。app.json5的优先级更高，即两种方式都配置后，以app.json5中的配置为准。关于ASAN\_OPTIONS的配置方式和常用参数请参考[配置参数](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-stability-asan-detection#section1496994494018)。

#### 使用ASan

1.  运行或调试当前应用。
2.  当程序出现内存错误时，弹出ASan log信息，点击信息中的链接即可跳转至引起内存错误的代码处。日志中各字段的说明请参考[ASan日志规格](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/address-sanitizer-guidelines#asan日志规格)，异常检测类型请参考[ASan异常检测类型](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-stability-asan-detection#section12508111110451)。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/ab/v3/5uAMWq89Sbatf5osuqGliw/zh-cn_image_0000002594474732.png?HW-CC-KV=V1&HW-CC-Date=20260612T073902Z&HW-CC-Expire=86400&HW-CC-Sign=E93FDDF7AF77CBBC4113828D36F093F6B8E2AEE6C0A9FC85775F22AD64EDE709)