C++ 运行ThreadSanitizer时出现致命异常

C++ 运行ThreadSanitizer时出现致命异常,c++,multithreading,gcc,C++,Multithreading,Gcc,我一直试图让ThreadSanitarizer与我的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&am

我一直试图让ThreadSanitarizer与我的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);
}
当通过
strace
进行检查时,这似乎是因为它试图
mmap
1TB内存,因此使用
ENOMEM
失败。我已经启用了ASLR,现在我不知道这可能是什么——所以问题是,有人成功地实现了吗

在我深入研究库代码之前,我希望有人可能已经遇到了这个问题

环境: 通用条款4.8.2
尝试了内核:3.0.10和2.6.32(都是Suse),但运气不好……

当我在SLES11SP3上使用
clang 3.4.2
的TSan遇到这个故障时,我能够通过首先修改shell的
ulimit
来修复它,这样我可以创建一个如此大的映射,然后我需要以超级用户的身份执行它

$ ./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
$/a.out
致命:ThreadSanitarizer检查失败:bri/llvm-3.4.2.src/projects/compiler rt/lib/sanitarizer\u common/sanitarizer\u allocator.h:316“((kSpaceBeg))==((reinterpret\u cast(Mprotect(kSpaceBeg,kSpaceSize)))”(0x7d000000000,0xfffffffffff4)
致命:ThreadSanitizer:未能拦截pthread_mutex_lock
$ulimit-v
10588960
$ulimit-v$(10588960*1024))
$ulimit-v
10843095040
美元/年
==11348==警告:程序在有限的虚拟地址空间中运行,这与ThreadSanitarizer不兼容。
==11348==使用无限虚拟地址空间重新执行。
==11348==警告:程序在有限的虚拟地址空间中运行,这与ThreadSanitarizer不兼容。
==11348==使用无限虚拟地址空间重新执行。
==11348==警告:程序在有限的虚拟地址空间中运行,这与ThreadSanitarizer不兼容。
==11348==使用无限虚拟地址空间重新执行。
...
#只能恢复w/Ctrl-C。。。
$sudo./a.out
root用户的密码:
==11351==警告:程序在有限的虚拟地址空间中运行,这与ThreadSanitarizer不兼容。
==11351==使用无限虚拟地址空间重新执行。
llvm符号:未知命令行参数“--默认arch=x86\U 64”。请尝试:'/usr/bin/llvm symboler-help'
llvm符号器:你的意思是“-demangle=x86_64”吗?
==11351==警告:无法读取fd 3处的符号器
llvm符号器:未知的命令行参数'--default arch=x86_64'。请尝试:'/usr/bin/llvm symboler-help'
llvm符号器:你的意思是“-demangle=x86_64”吗?
==11351==警告:外部符号器未正确启动!
==11351==警告:无法使用并重新启动外部符号器!
==================
警告:ThreadSanitizer:数据争用(pid=11351)
线程T1在0x7fbca5148c48处写入大小为4的数据:
#0 Thread1/home/bri/tmp/tsan/tiny_race.c:4(exe+0x0000000ad64f)
#1:0(a.out+0x000000052af4)
主线程先前在0x7fbca5148c48处写入大小为4的数据:
#0 main/home/bri/tmp/tsan/tiny_race.c:11(exe+0x0000000ad6a3)
主线程在以下位置创建的线程T1(tid=11354,正在运行):
#0 pthread_创建bri/tsan/rtl/tsan_拦截器。cc:877(exe+0x000000052c2b)
#1 main/home/bri/tmp/tsan/tiny_race.c:10(exe+0x0000000ad694)
摘要:ThreadSanitarizer:data race/home/bri/tmp/tsan/tiny_race.c:4 Thread1
==================
ThreadSanitarizer:报告了1个警告
symboler
警告很可能是与我的特定构建的
clang
相关的故障,请忽略它们。它可能只用于对C++符号名称进行解扩。

$ ./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