AddressSanitizer检测到运行时错误但无详情,如何查看具体错误信息?
解决LeakSanitizer致命错误并获取AddressSanitizer错误详情
1. 规避LeakSanitizer的ptrace冲突
错误提示明确指出LeakSanitizer无法在ptrace(如gdb、strace)环境下工作,所以不要用调试器启动程序,直接在终端执行编译后的可执行文件:
- 先设置LSAN环境变量提升日志详细度:
export LSAN_OPTIONS=verbosity=1:log_threads=1 - 直接运行程序:
此时LeakSanitizer会正常输出泄漏信息,AddressSanitizer也会同步输出缓冲区溢出、野指针等错误的具体栈信息。./scrmenu
2. 排查_FORTIFY_SOURCE=2与ASAN的兼容性
-D_FORTIFY_SOURCE=2和AddressSanitizer在部分GCC/glibc版本组合下存在兼容性问题,可按以下方式处理:
- 先暂时移除
_FORTIFY_SOURCE=2,单独用ASAN编译运行,优先获取原始未定义行为的错误信息:
因为你已经添加了gcc -g -o scrmenu -fsanitize=address caomenu.c superbox.c -L/opt/oracle/product/19c/dbhome_1/lib -L/usr/lib64/ -lclntsh -lcurses-g调试符号,ASAN会直接输出错误对应的文件名、行号和调用栈。 - 若必须保留
_FORTIFY_SOURCE=2,需配合优化选项使用(该宏在-O0下无效,仅在-O1及以上生效),调整编译命令:
同样设置LSAN环境变量后直接运行程序,不要使用调试器。gcc -g -O2 -o scrmenu -fsanitize=address -D_FORTIFY_SOURCE=2 caomenu.c superbox.c -L/opt/oracle/product/19c/dbhome_1/lib -L/usr/lib64/ -lclntsh -lcurses
3. 安装缺失的调试信息
错误提示中提到缺少debuginfos,安装这些包能让错误栈显示更完整的函数名和行号,执行以下命令:
yum debuginfo-install glibc-2.28-189.5.0.1.el8_6.x86_64 libasan-8.5.0-16.0.1.el8_7.x86_64 libgcc-8.5.0-16.0.1.el8_7.x86_64 libnsl-2.28-189.5.0.1.el8_6.x86_64 libstdc++-8.5.0-15.0.2.el8.x86_64 ncurses-libs-6.1-9.20180224.el8.x86_64 numactl-libs-2.0.12-13.el8.x86_64 sssd-client-2.7.3-4.0.1.el8_7.1.x86_64
安装完成后,ASAN输出的错误信息会精准定位到代码中的问题行。
补充说明
AddressSanitizer编译后程序不崩溃,是因为它会拦截内存错误行为,标记非法内存区域并输出错误信息,而非直接让程序崩溃。即使程序正常退出,也要仔细查看ASAN的输出内容,可能存在潜在的内存错误提示。
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

