Ubuntu 23.10下-fsanitize=address编译C++程序报错解决咨询
AddressSanitizer 异常问题的解决办法
手动指定Shadow内存起始地址
运行程序时通过环境变量指定ASAN的阴影内存地址,避开现有内存映射冲突:ASAN_OPTIONS=shadow_memory_address=0x7fff00000000 ./test可以通过
cat /proc/self/maps查看当前系统内存布局,选择一段未被占用的连续地址段替换上述值,比如0x7fe000000000等。调整栈大小限制
避免直接设置ulimit -s unlimited,改为设置一个较大的固定栈大小:ulimit -s 65536该值对应64MB栈空间,足以应对大多数场景,同时不会触发Shadow内存冲突。
降级或更新内核
Ubuntu 6.5.0-25内核存在与AddressSanitizer的兼容性问题,可尝试降级到更稳定的6.2系列内核:sudo apt install linux-image-6.2.0-39-generic linux-headers-6.2.0-39-generic安装完成后重启系统,在GRUB菜单中选择该内核启动。也可以等待官方推送内核更新修复该问题。
更换编译器或更新组件
尝试使用clang替代g编译,clang的ASAN实现可能与当前内核兼容性更好:clang++ test.cpp -std=c++23 -fsanitize=address -o test或者更新g++及ASAN相关库:
sudo apt update && sudo apt upgrade gcc-13 libasan8检查系统内存资源
AddressSanitizer需要约2倍于程序内存的额外空间,内存不足会导致随机错误。用free -h检查内存使用,若内存不足,可添加交换空间:sudo fallocate -l 4G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
内容的提问来源于stack exchange,提问作者TheFortyTwo
相关产品推荐
相关产品推荐

