问题所在
最近,在Linux内核6.6.6和更高版本上,发现thread sanitizer will always lead to this error:
FATAL: ThreadSanitizer: unexpected memory mapping 0x5c9bd4d2b000-0x5c9bd4d4b000
个
我可以通过用C编写一个Hello World示例来重现这一点
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
}
并在Arch Linux(Kernel 6.7.0)上使用TSan+编译它,并使用:
clang -o play -fsanitize=thread -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer src/play.c
./play
这将产生上述错误(具有不同的存储器地址).
根据GitHub的问题,这也会发生在只定义空的main()函数的C++文件中.
问题是
你有什么 Select 来处理这件事吗?
我最近才开始更深入地研究低级操作,以我目前的知识水平,我只能勉强使用use种线程消毒剂.ASLR(似乎是问题的原因)对我来说完全陌生,操纵它的 Select 和后果是什么.
GitHub问题提到了两种可能的解决方法:
- 禁用ASLR(我只找到this SO question for this个)
- 通过
sudo sysctl vm.mmap_rnd_bits=30
%降低ASLR
我已经try 了2.并按照描述重新编译+运行了该示例,这并没有解决问题.
我很犹豫是否按照1禁用ASLR,因为我不知道这意味着什么,也不知道如何"撤销"这一改变.
还有什么其他一般的 Select 来解决这个问题呢?