You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AddressSanitizer检测到运行时错误但无详情,如何查看具体错误信息?

解决LeakSanitizer致命错误并获取AddressSanitizer错误详情

1. 规避LeakSanitizer的ptrace冲突

错误提示明确指出LeakSanitizer无法在ptrace(如gdb、strace)环境下工作,所以不要用调试器启动程序,直接在终端执行编译后的可执行文件:

  • 先设置LSAN环境变量提升日志详细度:
    export LSAN_OPTIONS=verbosity=1:log_threads=1
    
  • 直接运行程序:
    ./scrmenu
    
    此时LeakSanitizer会正常输出泄漏信息,AddressSanitizer也会同步输出缓冲区溢出、野指针等错误的具体栈信息。

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及以上生效),调整编译命令:
    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
    
    同样设置LSAN环境变量后直接运行程序,不要使用调试器。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:35:27