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

关于AddressSanitizer中Shadow bytes的来源与读取方法问询

AddressSanitizer Shadow Bytes 详解:来源、读取方法及stack-after-return标记

Shadow Bytes的地址怎么来的?

AddressSanitizer(Asan)会给进程的每8字节真实内存,分配1字节的Shadow内存用来标记状态,二者通过固定比例映射:

  • 64位系统下,Shadow地址 = (真实地址 >> 3) + 0x7fff8000(不同架构可能有小差异,但核心是8:1的映射关系)

你看到的0x0ffb70398000,就是对应某段已释放栈内存的Shadow地址,其中f5是Asan预定义的标记值,专门用来标识函数返回后已被回收的栈空间(stack-after-return)。

怎么在GDB里读取Shadow Bytes的内容?

  1. 先编译带Asan和调试信息的程序:
    gcc -fsanitize=address -g your_code.c -o your_program
    
  2. 启动GDB调试:
    gdb ./your_program
    
  3. 直接查看目标Shadow地址的内容,用x/xb指令(以1字节十六进制格式打印):
    x/xb 0x0ffb70398000
    
    执行后会输出0xf5,和Asan报告里的标记一致。
  4. 如果想找到对应的真实栈地址,用逆转换公式计算:
    print (void*)((0x0ffb70398000 - 0x7fff8000) << 3)
    
    得到真实地址后,就能查看这段已被标记的栈内存内容:
    x/8xw 真实地址
    
    (这里x/8xw表示以4字节为单位,打印8个十六进制值)

关于stack-after-return(f5)标记的说明

当函数执行完返回时,Asan会自动把该函数栈帧对应的Shadow字节全部设为0xf5。一旦后续代码不小心访问这段已经被释放的栈空间,Asan就会立刻触发报错,并把对应的Shadow标记信息打印出来,直接帮你定位到“访问返回后栈内存”的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:58:22