使用TSan检测线程错误
============

TSan（ThreadSanitizer）是一个检测数据竞争的工具。它包含一个编译器插桩模块和一个运行时库。TSan开启后，会使性能降低5到15倍，同时使内存占用率提高5到10倍。关于TSan的检测原理请参考[TSan](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-stability-tsan-detection)。

#### 使用约束

*   ASan、TSan、UBSan、HWASan不能同时开启，只能开启其中一个。
*   TSan开启后会申请大量虚拟内存，其他申请大虚拟内存的功能（如gpu图形渲染）可能会受影响。
*   TSan不支持静态链接libc或libc++库。

#### 开启TSan

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

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

1.  点击**Run > Edit Configurations >** **Diagnostics**，勾选**Thread Sanitizer**。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/96/v3/LTvJWNlhTcmTU_X2pLk8mQ/zh-cn_image_0000002594635038.png?HW-CC-KV=V1&HW-CC-Date=20260612T073902Z&HW-CC-Expire=86400&HW-CC-Sign=48EA7231CB51010538EA096DFE6173320342CE9C3ACE9BAC813FB01560F50959)
    
2.  如果有引用本地library，需在library模块的build-profile.json5文件中，配置arguments字段值为“-DOHOS\_ENABLE\_TSAN=ON”，表示以TSan模式编译so文件。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/a3/v3/cKrYwkTNRz2Ue6zYCVDZEg/zh-cn_image_0000002594475116.png?HW-CC-KV=V1&HW-CC-Date=20260612T073902Z&HW-CC-Expire=86400&HW-CC-Sign=ED275001EB420B4B76764FB9C85D252BE27E1EF3E7263C46EF899FDC33145449)
    

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

1.  修改工程目录下AppScope/app.json5，添加TSan配置开关。
    
     "tsanEnabled": true
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/32/v3/OWPW6OryS2GkwyuyfO0siw/zh-cn_image_0000002625074621.png?HW-CC-KV=V1&HW-CC-Date=20260612T073902Z&HW-CC-Expire=86400&HW-CC-Sign=0544A64312E4543A481FE49F86F7D14D226682FC755E8D7F5A6A1D8B858990FA)
    
2.  设置模块级构建TSan插桩。
    
    在需要开启TSan的模块中，通过添加构建参数开启TSan检测插桩，在对应模块的模块级build-profile.json5中添加命令参数：
    
    "arguments": "-DOHOS\_ENABLE\_TSAN=ON"
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/d7/v3/dFffz6iAQtqeci3ABSuF3g/zh-cn_image_0000002624994475.png?HW-CC-KV=V1&HW-CC-Date=20260612T073902Z&HW-CC-Expire=86400&HW-CC-Sign=1CAB23E3A02EE3DF36812B07F0187F5A9B7DD2E119E033D79A077C3EF39844D6)
    

#### 使用TSan

1.  运行或调试当前应用。
2.  当程序出现线程错误时，弹出TSan log信息，点击信息中的链接即可跳转至引起线程错误的代码处。日志中的异常检测类型请参考[TSan异常检测类型](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-stability-tsan-detection#section1180812915516)。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/c3/v3/0u7TKQICTHG7EPCupr_Mgw/zh-cn_image_0000002625074619.png?HW-CC-KV=V1&HW-CC-Date=20260612T073902Z&HW-CC-Expire=86400&HW-CC-Sign=4A233688E54938FF3C88933C5AC096C80387A568047B8D1A08E983070ABBB6E7)
    
3.  如果是release应用，本地无工程代码，可以使用AnalyzeStackTrace功能，提供要解析堆栈的so，解析结果为源码地址。
    
    ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/fa/v3/e9eCIif2QwihAIbXG_FcMQ/zh-cn_image_0000002625074617.png?HW-CC-KV=V1&HW-CC-Date=20260612T073902Z&HW-CC-Expire=86400&HW-CC-Sign=8C788B06777E47F94D507FA25EE73FB190C1D19D1F7B105075B6931A8CF4A19C)