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

遵循Sanitizer Github建议后,AddressSanitizer仍破坏GDB状态

解决AddressSanitizer在GDB中终止会话且无法获取栈信息的问题

我碰到了double-free漏洞,用开启AddressSanitizer(AS)的Debug构建能复现这个问题,但在GDB里运行时,AS会直接终止GDB会话。我查了AS的官方调试指南,按建议在会话开始时执行了(gdb) break __asan::ReportGenericError这个命令,可漏洞被检测到后GDB还是丢了状态,执行(gdb) bt显示No stack.

调整AS的错误处理行为

默认情况下,AS检测到内存错误后会直接终止进程,导致GDB丢失上下文。你可以通过环境变量让AS在报错后暂停而非退出:

  • 启动GDB前设置:export ASAN_OPTIONS=abort_on_error=0:halt_on_error=1
  • 或者在GDB内部设置:(gdb) set environment ASAN_OPTIONS=abort_on_error=0:halt_on_error=1

优化断点设置

__asan::ReportGenericError可能不是最精准的断点,针对double-free场景,试试这些更直接的断点:

  • 断在double-free的专属报告函数:(gdb) break __asan::ReportDoubleFree
  • 或者断在AS的通用错误报告入口:(gdb) break __asan_report_error

确保工具链版本兼容

老版本GDB可能和新版AS存在兼容性问题,导致断点失效或栈信息丢失。建议升级GDB到最新稳定版,或者使用和编译程序时相同的工具链自带的GDB(比如clang或gcc配套的GDB)。

完整调试流程示例

  1. 启动GDB前配置环境变量:
    export ASAN_OPTIONS=abort_on_error=0:halt_on_error=1
    gdb ./your_debug_binary
    
  2. 在GDB中设置断点并运行:
    break __asan::ReportDoubleFree
    run
    
  3. 断点命中后,执行bt就能看到完整的调用栈,定位double-free的触发位置了。

内容的提问来源于stack exchange,提问作者intrigued_66

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:25:27