有一个遗留项目,其中包含成千上万的SLOC,并运行许多不同的线程。
有一个包含非原子成员的数据结构,理论上可以由不同的线程使用,但是由于代码的高度复杂性,可能难以通过简单的代码分析来识别这种情况。
时间不一定总会导致崩溃,但可能会发生(例如,该成员使用堆)。
是否有任何方法可以识别此类变量,例如在测试过程中,是否使应用程序在线程第一次访问此变量期间崩溃,而该线程不同于之前访问它的线程?
答案 0 :(得分:1)
您可以尝试将clang++
与ThreadSanitizer结合使用。这涉及使用-fsanitize=thread -ltsan
重新编译代码并执行它。 TSan应该检测数据争用,并给您堆栈跟踪以找出导致它们的原因。
ThreadSanitizer是检测数据争用的工具。它由一个编译器检测模块和一个运行时库组成。 ThreadSanitizer引入的典型速度下降约为5倍至15倍。 ThreadSanitizer引入的典型内存开销约为5x-10x。