关于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的内容?
- 先编译带Asan和调试信息的程序:
gcc -fsanitize=address -g your_code.c -o your_program - 启动GDB调试:
gdb ./your_program - 直接查看目标Shadow地址的内容,用
x/xb指令(以1字节十六进制格式打印):
执行后会输出x/xb 0x0ffb703980000xf5,和Asan报告里的标记一致。 - 如果想找到对应的真实栈地址,用逆转换公式计算:
得到真实地址后,就能查看这段已被标记的栈内存内容:print (void*)((0x0ffb70398000 - 0x7fff8000) << 3)
(这里x/8xw 真实地址x/8xw表示以4字节为单位,打印8个十六进制值)
关于stack-after-return(f5)标记的说明
当函数执行完返回时,Asan会自动把该函数栈帧对应的Shadow字节全部设为0xf5。一旦后续代码不小心访问这段已经被释放的栈空间,Asan就会立刻触发报错,并把对应的Shadow标记信息打印出来,直接帮你定位到“访问返回后栈内存”的问题。
内容的提问来源于stack exchange,提问作者user1094822
相关产品推荐
相关产品推荐

