博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32/GD32上内存堆栈溢出探测研究
阅读量:6339 次
发布时间:2019-06-22

本文共 1840 字,大约阅读时间需要 6 分钟。

  hot3.png

无数次遭受堆栈溢出折磨,随着系统变得复杂,故障点越来越难以查找!

主要溢出情况如下:
1,一般RAM最后两块空间是堆Heap和栈Stack,堆从下往上用,栈从上往下用,任意一个用完,都会进入对方的空间
2,如果栈用完,进入堆的空间,这个时候系统是不会有任何异常的,也就是说,栈底没有什么意义。除非堆和栈指针重叠,否则大家相安无事,尽管栈用了堆的
3,如果栈用完进入堆,并且还碰到了堆的空间,这个时候系统仍然没有异常,但是堆栈会相互修改数据。最悲剧的就是栈里面保存的然会地址lr,一旦被堆指针修改,返回的时候就会跳到别的地址空间去了。绝大多数时候是这种情况,并且大多数跳到无效空间去。你应该感谢它跳到无效空间,让你马上发现错误。否则堆栈互相穿透而不报错,然后系统工作出现数据错乱,到时候看你想撞头还是想跳楼!
4,使用Keil的微库,malloc要用到堆空间,如果堆空间用完,再malloc的时候得到空指针,但是不会报错。然而,如果使用C++的new,这个时候会报错!
因为主线程和中断处理的存在,随时可能分配释放内存,这就导致了问题随时可能发生!非常难检查问题所在!
因此,SmartOS v2.5增加了内存堆栈溢出探测模块
声明:

#ifdef DEBUGvoid* operator new(uint size);void* operator new[](uint size);void operator delete(void * p);void operator delete [] (void * p);#endif

实现:

extern uint __heap_base;extern uint __heap_limit;void* operator new(uint size){    debug_printf(" new size: %d ", size);    void * p = malloc(size);    if(!p)        debug_printf("malloc failed! size=%d ", size);    else    {        debug_printf("0x%08x ", p);        // 如果堆只剩下64字节,则报告失败,要求用户扩大堆空间以免不测        uint end = (uint)&__heap_limit;        if((uint)p + size + 0x40 >= end) debug_printf(" + %d near HeapEnd=0x%08x", size, end);    }    assert_param(p);    return p;}void* operator new[](uint size){    debug_printf(" new size[]: %d ", size);    void * p = malloc(size);    if(!p)        debug_printf("malloc failed! size=%d ", size);    else    {        debug_printf("0x%08x ", p);        // 如果堆只剩下64字节,则报告失败,要求用户扩大堆空间以免不测        uint end = (uint)&__heap_limit;        if((uint)p + size + 0x40 >= end) debug_printf(" + %d near HeapEnd=0x%08x", size, end);    }    assert_param(p);    return p;}void operator delete(void * p){    debug_printf(" delete 0x%08x ", p);    if(p) free(p);}void operator delete[](void * p){    debug_printf(" delete[] 0x%08x ", p);    if(p) free(p);}

通过重载new/delete实现,并且带有64字节提前预测功能!在堆即将用完之前预警!

转载于:https://my.oschina.net/nnhy/blog/1591878

你可能感兴趣的文章
10 个 Linux 中方便的 Bash 别名
查看>>
全新 DOCKER PALS 计划上线,带给您不一样的参会体验! ...
查看>>
Android开发之自定义View(二)
查看>>
python爬虫之微打赏(scrapy版)
查看>>
自制操作系统Antz day08——实现内核 (中) 扩展内核
查看>>
poj-1056-IMMEDIATE DECODABILITY(字典)
查看>>
区块链应用 | 不知道什么时候起,满世界都在谈区块链的事情
查看>>
小程序爆红 专家:对简单APP是巨大打击
查看>>
FarBox--另类有趣的网站服务【转】
查看>>
在非纯色背景上,叠加背景透明的BUTTON和STATIC_TEXT控件
查看>>
Distributed2:Linked Server Login 添加和删除
查看>>
Java中取两位小数
查看>>
使用 ftrace 调试 Linux 内核【转】
查看>>
唯一聚集索引上的唯一和非唯一非聚集索引
查看>>
Spark新愿景:让深度学习变得更加易于使用——见https://github.com/yahoo/TensorFlowOnSpark...
查看>>
linux磁盘配额
查看>>
NFS文件共享服务器的搭建
查看>>
%r 和 %s 该用哪个?
查看>>
小公司职场不是“切糕”
查看>>
play工程部署到云服务器
查看>>