我试图--thread-sanitizer在OSX上使用clang的选项:
$ clang++ -fthread-sanitizer -fpic tsan1.cc
Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.3.0
Thread model: posix
[...]
clang -cc1 version 4.2 based upon LLVM 3.2svn default target x86_64-apple-darwin12.3.0
[...]
Undefined symbols for architecture x86_64:
"___tsan_func_entry", referenced from:
threadfunc(void*) in tsan1-6f7gbr.o
[...]
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
看起来像一个链接错误.我应该链接一些额外的库吗?
我正在尝试在 Xcode 11.2.1 中使用 Thread Sanitizer,但是每当应用程序启动时(只是来自 Xcode 模板的单个视图应用程序,没有添加任何内容)它会点击 __abort_with_payload:
libsystem_kernel.dylib`__abort_with_payload:
0x7fff51b73be0 <+0>: movl $0x2000209, %eax ; imm = 0x2000209
0x7fff51b73be5 <+5>: movq %rcx, %r10
0x7fff51b73be8 <+8>: syscall
-> 0x7fff51b73bea <+10>: jae 0x7fff51b73bf4 ; <+20>
0x7fff51b73bec <+12>: movq %rax, %rdi
0x7fff51b73bef <+15>: jmp 0x7fff51b54a89 ; cerror_nocancel
0x7fff51b73bf4 <+20>: retq
0x7fff51b73bf5 <+21>: nop
0x7fff51b73bf6 <+22>: nop
0x7fff51b73bf7 <+23>: nop
Run Code Online (Sandbox Code Playgroud)
Apple 的文档或其他人使用 Thread Sanitizer 的指南都没有说你需要做的只是在方案的设置中打勾,但对我来说这是行不通的:(
打印出 $arg5 给出
pthread_t 已损坏
这听起来不太好!
这是在 Catalina 10.15.2 上使用 iPhone 11 Pro Max 模拟器
对于地址清理程序也有类似的问题,但对于线程清理程序,它不起作用,我尝试中断 __sanitizer_print_stack_trace,但它也不起作用。
我制作了一个自定义属性包装器,它提供了一种使用os_unfair_lock. 在启用 TSAN 的情况下测试我的包装器后,在使用锁定获取时报告了访问争用错误os_unfair_lock_lock(如下图所示)
不知何故,TSAN 报告认为线程安全的锁定结构并非如此。这里发生了什么?
我正在尝试构建我的项目并在另一台机器上运行可执行文件,在其中我可以看到线程相关的问题(如果存在)。我正在使用 VS2019 并-fsanitize=thread -fPIE -pie -g在Configuration Properties->Debugging->Command Arguments. 当我运行 .exe 文件时,我没有看到任何我认为应该生成的文件。我是否向编译器提供了错误的参数或者这里出了什么问题?
我正在运行一个带有线程清理程序的程序,并且想知道如何解释以下警告:
==================
WARNING: ThreadSanitizer: data race (pid=2788668)
Read of size 4 at 0x7f7eefc4e298 by main thread:
[Stacktrace follows...]
Previous write of size 8 at 0x7f7eefc4e298 by thread T27:
[Stacktrace follows...]
Location is heap block of size 307272 at 0x7f7eefc1c000 allocated by thread T27
[Stacktrace follows...]
Thread T27 (tid=2790352, running) created by main thread at:
[Stacktrace follows...]
==================
Run Code Online (Sandbox Code Playgroud)
我将此消息解释为只是说主线程读取了先前由不同线程写入的内存。不同的线程是由主线程创建的,并且该不同的线程也分配了内存。它是否正确?如果是这样,有没有办法在接下来的运行中抑制这个特定的警告?