ThreadSanitizer是检测数据争用的工具。它由一个编译器检测模块和一个运行时库组成。Thread Sanitizer会记录每一个内存访问的信息,并检测该访问是否参与了竞争。
Data Race
Data Race是指多个线程在没有正确加锁的情况下,同时访问同一块数据,并且至少有一个线程是写操作,对数据的读取和修改产生了竞争,从而导致各种不可预计的问题。

Data Race的问题非常难查,Data Race一旦发生,结果是不可预期的,也许直接就Crash了,也许导致执行流程错乱了,也许把内存破坏导致之后某个时刻突然Crash了。
在纯Happens-before模式下会漏掉很多竞争情况,在混合模式下有存在太多的噪音。因此到了2008年底,我们就实现一个自己的竞争检测器,我们称之为“ThreadSanitizer”。
它采用了一种新的混合算法,可以方便地运行在纯Happens-before模式下,它也支持动态的annotations。同时我们让竞争报告尽可能地易读。

ThreadSanitizer采用的是动态检测技术,它不会扫描分析源代码,而是以程序运行中产生的一系列离散的事件点为输入,进行分析,从而找到竞争。最重要的事件就是内存访问和同步。

内存访问即Read和Write,同步事件则要么是锁事件要么是Happens-before事件。
锁事件又分为WrLock,RdLock,WrUnLock,RdUnLock。
Happens-before事件则分为Signal和Wait。这些事件由运行程序产生,经由底层binary translation框架(Valgrind)的帮助交给ThreadSanitizer。

在进行进一步的介绍之前,我们需要先来认识两个竞争检测算法:LockSet-Based与Happens-before。
以下内容来自:Hybrid Dynamic Data Race Detection这篇文章。
LockSet-Based竞争检测
基于这样一个假设:无论何时只要两个不同的线程访问了相同的共享内存地址,并且其中一个为写操作,那么这两次访问操作必须要持有某一个共同的锁。
当该假设被违反时,我们就视为具有潜在的竞争情况。可以用如下公式来描述:
Happens-before竞争检测
ppens-before关系可以定义如下:

  1. 两个事件ei,ej如果同属于一个线程,并且ei发生在ej之前,那么我们就说
    
  2. i->j (i happen before j)

  3. 如果ei是消息g的发送方,ej是消息g的接收方,那么我们也说i->j
    

Happens-before具有传递性,即:i->j & j->k可以推出i->k。

实际上,happens-before竞争检测也是非常简单的:如果我们观察到两个事件ei和ej,它们访问了相同的内存位置,同时至少一个是Write操作,同时既没有i->j,也没有j->i,我们就认为存在潜在的竞争。
也就是说如果两个线程访问了同一个内存地址,但是这两次访问之间又没有Lamport定义的那种happens-before关系,我们就认为它们之间存在潜在的竞争。
实际上只要是它报告的竞争都是说明实现上存在可以改进的线程调度问题,但是另一方面它存在更多的漏报。
当然作为动态检测技术,这两种方法都存在漏报,因为它们的检测依赖于实际的程序执行过程。

简单来说:锁和Happens-before都是保证了两个线程不会同时访问同一内存地址。锁通过互斥保证,Happens-before则建立了不同线程中事件先后的偏序关系。没有这些就意味着存在潜在竞争。
Lockset based要求更严,因此存在误报,但是不会漏报。Happens-before要求更松,因此存在漏报,但是不会误报**
两者优势互补,因此后面就有了基于二者的混合模式:锁用Lockset-Based,不再为Unlock/lock建立happen before关系,剩下的再用happens-before。但是这种模式仍然存在误报
另外在理解竞争检测算法时,还是要从各个线程发生的事件来考虑,而不是从线程的实现代码上来考虑。也就是说在每一次检测中,每个线程都对应了一系列前后发生的事件,然后去判断这些事件间的happens-before关系(或lockset存在交集),在那些没有此类关系的事件中,如果访问了相同的内存区域,那么就说明存在竞争。
例子一:**

#include <pthread.h>
int Global;
void *Thread1(void *x) {Global = 42;return x;
}
int main() {pthread_t t;pthread_create(&t, NULL, Thread1, NULL);Global = 43;pthread_join(t, NULL);return Global;
}

编译:$ clang -fsanitize=thread -g -O1 tiny_race.c
如果检测到错误,程序将向stderr打印一条错误消息。当前,ThreadSanitizer使用外部addr2line过程来象征其输出 (以后将予以修复)

该报告包含数据竞争的内存访问的说明。对于这两种访问,它都会说出内存地址(您可以与日志/调试器匹配),大小以及是否是读或写的。
请注意,第一个内存访问是“当前”访问,即检测到竞争的访问。而第二次访问是先前的一些内存访问。
共享内存地址:0x0000014b3c60
对于这两种访问,报告都会说出线程ID,并显示线程创建堆栈(主线程除外)。
如果竞争发生在堆内存位置上,则报告还包含分配位置和堆块的参数:
https://github.com/google/sanitizers/wiki/ThreadSanitizerReportFormat
例子二:
$ cat simple_race.cc

#include <pthread.h>
#include <stdio.h>int Global;void *Thread1(void *x) {Global++;return NULL;
}void *Thread2(void *x) {Global--;return NULL;
}int main() {pthread_t t[2];pthread_create(&t[0], NULL, Thread1, NULL);pthread_create(&t[1], NULL, Thread2, NULL);pthread_join(t[0], NULL);pthread_join(t[1], NULL);
}

上面的代码在不加锁的情况下,两个线程同时去修改Global变量,从而导致Data Race。使用gcc的-fsanitize=thread 编译,执行
clang -fsanitize=thread -g -O1 simple_race.cc

执行程序,如果发生Data Race,错误信息会直接输出出来。如果错误信息比较多,重定向输出流到文件里,慢慢分析:

./a.out >result.txt 2>&1

ThreadSanitizer检测工具-动态数据竞争检测技术相关推荐

  1. 深度学习——day38 读论文:基于深度学习的数据竞争检测方法(DeleRace计算机研究与发展 2022)

    基于深度学习的数据竞争检测方法 chap0 Introduction 本文贡献: 原文及笔记下载 chap1 DeleRace 1.1 检测框架 1.2 选取实际应用程序 1.3 特征提取 1.3.1 ...

  2. android oom 检测工具,Android中UI检测、内存泄露、OOM、等优化处理

    对Android整个优化分析,非常棒,下面是自己的积累笔记.可直接看原文. 界面检测工具: Fps: GPU检测, 使用Lint进行资源及冗余UI布局等优化 (很强大,布局的冗余) Memory检测G ...

  3. [安装程序]HDDScan(硬盘坏道检测工具) 3.3[详细检测你的硬盘信息]

    [安装程序]HDDScan(硬盘坏道检测工具) 3.3[详细检测你的硬盘信息] 软件名称:HDDScan(硬盘坏道检测工具) 3.3[详细检测你的硬盘信息] 软件大小:1.74 MB 软件类型:国产软 ...

  4. notepad++调用VIVADO语法检测工具进行verilog语法检测

    Notepad++ 色彩过于明显,已不再使用该编辑器 Notepad++安装NppExec插件 在notepad++界面中选择 插件>插件管理>安装NppExec 获取VIVADO语法检测 ...

  5. 硬盘检测工具+linux,linux硬盘检测工具:Smartmontools使用指南

    linux硬盘检测工具:Smartmontools使用指南 来源:互联网 作者:佚名 时间:2013-04-10 13:32 在服务器管理的实际环境中,硬盘是最容易出现问题及发生故障的硬件,而且硬盘中 ...

  6. 2021最新微信域名链接检测工具 微信域名拦截检测接口

    前段时间年底在加上315这段时间腾讯重点监视在微信内推广的链接,在微信中分享文章带有不良内容的会被微信封,为了保证一个域名一直都能正常访问,需要及时检测链接域名是否被封,被封后就该立刻删除被封了的链接 ...

  7. 测试手机硬件检测软件是什么,手机硬件检测工具_手机硬件检测软件_手机硬件检测软件哪个好【最新】-太平洋电脑网...

    win7系统怎么检测电脑硬件的散热功能 win7系统怎么检测电脑硬件的散热功能 驱动人生硬件检测功能 驱动人生使用方法 驱动人生硬件检测功能使用方法来咯~有些朋友不知道驱动人生硬件检测怎么用,这个实用 ...

  8. linux下emmc检测工具,eMMC芯片Bug检测工具(eMMC check)下载 v1.3.0

    eMMC芯片Bug检测工具(eMMC check)安卓版可检测你的芯片是否有BUG,其实更大的用处还是看字库的写入时间以此来鉴别是否新机. 最近越来越多的人反映三星I9300莫名其妙的开不了机,开机卡 ...

  9. 电脑手机硬件测试软件,手机硬件检测工具_手机硬件检测软件_手机硬件检测软件哪个好【最新】-太平洋电脑网...

    win7系统怎么检测电脑硬件的散热功能 win7系统怎么检测电脑硬件的散热功能 驱动人生硬件检测功能 驱动人生使用方法 驱动人生硬件检测功能使用方法来咯~有些朋友不知道驱动人生硬件检测怎么用,这个实用 ...

  10. php后门检测工具,phpStudy后门如何检测和修复

    背景 一篇<Phpstudy官网于2016年被入*,犯罪分子篡改软件并植入后门>让人触目惊心,从官网的下载官方安装包也会有问题,由此可想而知目前已经有多少网站已经沦陷.接到消息的第一时间, ...

最新文章

  1. 牛课网--走格子(环形遍历数组并且找出指定步数的位置)
  2. 用SERVLET进行用户名和密码验证
  3. 限免 | PMCAFF 产品经理第一课,面向3-5年产品经理,全面提升产品能力
  4. 算法简介、7种算法分类
  5. mongodb语法与spring实现
  6. uml 类图聚合与组合
  7. 【新书推荐】《微软开源跨平台移动开发实践》带你走近微软开源开源跨平台技术
  8. 在dotnetnuke中去掉显示姓名中的空格
  9. Kafka日志刷新策略
  10. mysql 数据写入文件格式_数据写入
  11. tomcat编码设置
  12. 《西方哲学史》阅读笔记
  13. android 使用signingConfigs进行打包
  14. java 运行时获取泛型真实类型
  15. Android Studio 3.5.2版本安装流程
  16. NoSql的四大类型
  17. 生活杂感: 理性与感性
  18. 为什么当时那么多大佬不投资阿里?雷军:马云把项目说得太大,像个骗子!
  19. 小黄鸭调试法:拯救那些开发心里“无力回天”的bug
  20. C 语言编程 6.17 用100元人民币兑换10元,5元和1元的纸币(每一种都要有)共五十张。请用穷举法编程。共有多少种情况

热门文章

  1. JAVA就业管理系统(JAVA毕业设计)
  2. css中关于单行文本溢出部分用省略号显示
  3. 基于vue+html的Web网页音乐播放器设计
  4. pubg解封验证计算机怎么验证,绝地求生解封教程
  5. 电压和电流的有效值、瞬时值、平均值、最大值及其关系
  6. python3 url 获取域名ip
  7. 用clustalx打序列文件(.fa)失败是为什么?
  8. png图片怎么转换成jpg?png转jpg批量
  9. 录播网站 服务器,录播服务器
  10. 手机双摄像头有什么作用