下面是ubuntu16.04环境下,使用arm-none-eabi-gcc编译器,在STM32F427VIT6上测试堆溢出的方法
1.测试代码
#include <stdlib.h>
void* ptr =0;
int main()
{
void* p =0;
while(1){
p = malloc(10240);
if(ptr < p){
ptr = p;
}
free(p);
p = malloc(10240);
}
return 0;
}
2. 运行JLinkGDBServer和arm-none-eabi-gdb
nohup JLinkGDBServer -if swd -device STM32F427VI -endian little -speed 1000 -port 2331 -swoport 2332 -telnetport 2333 -vd -ir -localhostonly 0 -singlerun -strict -timeout 0 &
arm-none-eabi-gdb -iex 'target remote localhost:2331' -iex 'monitor reset' -iex 'monitor halt' -ex 'load' $(PROJECTDIR)/build/$(PROJECTNAME).elf
3. 输入gdb调试命令
b main # 设置在mian()函数处断点
c # 执行到main()会停下来
b 8 if ptr > 0x20018000 # 如果分配的内存地址超过范围,产生断点
c # 继续执行,直到满足断点条件
p p # 打印堆区指针,这个指针越来越大,说明可能存在内存泄漏
p ptr # 打印堆区指针,这个指针越来越大,说明可能存在内存泄漏
分析:ptr保存的是堆分配内存的最大地址,这个地址不能超过物理内存的最大地址