- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在努力让 ThreadSanitizer 与我拥有的 gcc 版本 (4.8.2) 一起工作,所以我采用了他们的简单示例:
#include <pthread.h>
#include <stdio.h>
#include <string>
#include <map>
typedef std::map<std::string, std::string> map_t;
void *threadfunc(void *p) {
map_t& m = *(map_t*)p;
m["foo"] = "bar";
return 0;
}
int main() {
map_t m;
pthread_t t;
pthread_create(&t, 0, threadfunc, &m);
printf("foo=%s\n", m["foo"].c_str());
pthread_join(t, 0);
}
并且在没有使用-fsanitize=thread
的情况下进行编译,如下:
g++ -o testtsan testtsan.cpp -lpthread
这很好,然后我添加了线程 sanitizer
g++ -o testtsan testtsan.cpp -lpthread -fsanitize=thread
当然,如果没有 -pie -fPIC
g++ -o testtsan testtsan.cpp -lpthread -fsanitize=thread -pie -fPIC
然后编译,但是在运行时,我得到:
FATAL: ThreadSanitizer CHECK failed: ../../../../libsanitizer/sanitizer_common/sanitizer_allocator.h:310 "((kSpaceBeg)) == ((reinterpret_cast<uptr>(Mprotect(kSpaceBeg, kSpaceSize))))" (0x7d0000000000, 0xffffffffffffffff)
FATAL: ThreadSanitizer: failed to intercept pthread_mutex_lock
通过 strace
检查时,这似乎是因为它试图mmap
1TB 内存,所以失败并返回 ENOMEM
。我已经启用了 ASLR,但现在我不知道这可能是什么 - 所以问题是,有人成功实现了吗?
在深入研究库代码之前,我希望有人可能已经遇到过这个......
环境:海湾合作委员会 4.8.2尝试过的内核:3.0.10 和 2.6.32(都是 Suse),没有运气......
最佳答案
当我在 SLES11SP3 上使用 clang 3.4.2
的 TSan 遇到此故障时,我能够通过首先更改我的 shell 的 ulimit
来修复它,这样我可以创建那么大的映射,然后我需要以 super 用户身份执行它。
$ ./a.out
FATAL: ThreadSanitizer CHECK failed: bri/llvm-3.4.2.src/projects/compiler-rt/lib/sanitizer_common/sanitizer_allocator.h:316 "((kSpaceBeg)) == (( reinterpret_cast<uptr>(Mprotect(kSpaceBeg, kSpaceSize))))" (0x7d0000000000, 0xfffffffffffffff4)
FATAL: ThreadSanitizer: failed to intercept pthread_mutex_lock
$ ulimit -v
10588960
$ ulimit -v $((10588960*1024))
$ ulimit -v
10843095040
$ ./a.out
==11348==WARNING: Program is run with limited virtual address space, which wouldn't work with ThreadSanitizer.
==11348==Re-execing with unlimited virtual address space.
==11348==WARNING: Program is run with limited virtual address space, which wouldn't work with ThreadSanitizer.
==11348==Re-execing with unlimited virtual address space.
==11348==WARNING: Program is run with limited virtual address space, which wouldn't work with ThreadSanitizer.
==11348==Re-execing with unlimited virtual address space.
...
# only able to recover w/Ctrl-C...
$ sudo ./a.out
root's password:
==11351==WARNING: Program is run with limited virtual address space, which wouldn't work with ThreadSanitizer.
==11351==Re-execing with unlimited virtual address space.
llvm-symbolizer: Unknown command line argument '--default-arch=x86_64'. Try: '/usr/bin/llvm-symbolizer -help'
llvm-symbolizer: Did you mean '-demangle=x86_64'?
==11351==WARNING: Can't read from symbolizer at fd 3
llvm-symbolizer: Unknown command line argument '--default-arch=x86_64'. Try: '/usr/bin/llvm-symbolizer -help'
llvm-symbolizer: Did you mean '-demangle=x86_64'?
==11351==WARNING: external symbolizer didn't start up correctly!
==11351==WARNING: Failed to use and restart external symbolizer!
==================
WARNING: ThreadSanitizer: data race (pid=11351)
Write of size 4 at 0x7fbca5148c48 by thread T1:
#0 Thread1 /home/bri/tmp/tsan/tiny_race.c:4 (exe+0x0000000ad64f)
#1 <null> <null>:0 (a.out+0x000000052af4)
Previous write of size 4 at 0x7fbca5148c48 by main thread:
#0 main /home/bri/tmp/tsan/tiny_race.c:11 (exe+0x0000000ad6a3)
Thread T1 (tid=11354, running) created by main thread at:
#0 pthread_create bri/tsan/rtl/tsan_interceptors.cc:877 (exe+0x000000052c2b)
#1 main /home/bri/tmp/tsan/tiny_race.c:10 (exe+0x0000000ad694)
SUMMARY: ThreadSanitizer: data race /home/bri/tmp/tsan/tiny_race.c:4 Thread1
==================
ThreadSanitizer: reported 1 warnings
symbolizer
警告可能是与我的特定 clang
构建相关的失败,请忽略它们。它可能仅用于分解 C++ 符号名称。
关于c++ - ThreadSanitizer FATAL 运行时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27058638/
我正在使用启用了线程清理器的 Clang-8 来编译下面的代码 std::atomic ptr {nullptr}; int data {0}; void producer() { std::st
我使用带有 -g3 和 -O1 标志的 Clang 进行编译,但是 TSan 提示说它发现了数据争用并且它输出了一个完全模糊的堆栈跟踪,没有清晰的行号。 在这种情况下如何查找行号? Pastebin
我的应用程序使用了 wxWidgets 库,它是通过 gcc 5.1.0 从源代码构建的,使用 -g 和 -O0 我使用 clang++36 -g -fsanitize=thread -stdlib=
在这个示例程序中,我试图避免使用前向声明和利用 lambda 函数(称为 data_race)的循环依赖 struct B{ int x; std::thread* tid;
Clang 有 -fsanitize-blacklist 编译开关来抑制来自 ThreadSanitizer 的警告。不幸的是,我无法让它工作。 这是一个我想抑制的例子: WARNING: Threa
我一直在努力让 ThreadSanitizer 与我拥有的 gcc 版本 (4.8.2) 一起工作,所以我采用了他们的简单示例: #include #include #include #incl
我将其归结为一个简单的独立示例。主线程入队 1000 个项目,一个工作线程尝试同时出队。 ThreadSanitizer 提示其中一个元素的读取和写入之间存在竞争,即使有一个获取-释放内存屏障序列保护
我想知道线程清理程序(clang)的死锁在哪里,但问题是程序被阻塞,并且在使用 -fsanitize=thread 选项编译期间未检测到死锁。并且执行结束没有任何结果,因为程序被阻塞(由于死锁而无法退
谁知道ThreadSanitizer ?有没有人在 windows (xp) 上使用这个工具?我从 here 下载最新版本.我为 VS2008 编写了测试应用程序(使用单个 printf("hello
ThreadSanitizer suppression files 之间有区别吗?和 blacklist files ? -- 当由 -fsanitize-blacklist= 的 llvm 特定编译
或者我必须使用单独的版本吗? -fsanitize 标志仅允许地址或线程,但是否允许多个? 问候 最佳答案 不,不可能将 AddressSanitizer 和 ThreadSanitizer 组合到一
我的自旋锁实现如下所示,我认为它不会导致任何数据竞争,但是当我使用 -fsanitize=thread 测试我的代码时,它报告 spin_unlock 有写数据竞争。怎么会这样?是误报吗? #defi
我正在使用ThreadSanitizer进行线程分析,并且收到一条警告,该警告使我对互斥锁的工作方式的理解非常困惑。我在Debian Stretch上使用gcc 6.3。 在一个类中,在一个线程中,我
请看下面的代码: #include #include class ReferenceCounted { public: ReferenceCounted() : ref_count_(
有没有人试过clang's ThreadSanitizer与 Intel Threading Building Blocks (TBB) ? 到目前为止,我的经验是您会收到很多警告,即使对于相对简单的
我使用 asm 编写了 atomic_inc 来递增整数,它实际上用于引用共享对象的计数。 gcc 4.8.2 -fsanitize=thread 报告数据竞争,我终于发现这可能是由我的 atomic
我是一名优秀的程序员,十分优秀!