我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

如何进行STM32/GD32上内存堆栈溢出探测研究

如何进行STM32/GD32上内存堆栈溢出探测研究,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

10余年的麦积网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整麦积建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“麦积网站设计”,“麦积网站推广”以来,每个客户项目都认真落实执行。

无数次遭受堆栈溢出折磨,随着系统变得复杂,故障点越来越难以查找!
主要溢出情况如下:
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字节提前预测功能!在堆即将用完之前预警!
如何进行STM32/GD32上内存堆栈溢出探测研究

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。


名称栏目:如何进行STM32/GD32上内存堆栈溢出探测研究
标题链接:http://shouzuofang.com/article/gpecje.html

其他资讯