当前位置:   article > 正文

为BUG编程:堆栈溢出(设备EC200U-CN,C语言)

为BUG编程:堆栈溢出(设备EC200U-CN,C语言)

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


目录

事件

EC200U-CN是啥

关于堆栈和堆栈溢出

栈有多大

编程原则:大变量不可使用栈

闲话


事件

        近日又捣腾一个C程序,别人写的,拿过来改。本来跑得挺好的,为了增加一点内容,我把一个主要数据结构增大了,然后就整个设备不停重启——是个硬件,EC200U-CN,移远的SOC。

        还好能强刷嘛(短接两根线进入强刷模式),各种办法跟踪(这东西比较费劲,没有屏幕),发现读写文件时出的问题,有异常信息“Detected event: 0x9db00000”,啥意思呢?网上也没有太多信息。

        是不是有大小限制呢?改成了分段读写,还是照常不停重启,但是终于从日志中发现有时候写成功的长度是不一样的,这大概说明不是读写文件的长度有限制(其实想想也应该明白,明明有更长的文件存在呢)。

        继续瞎跟踪啊,添加更多日志,突然注意到函数里面有个主结构的自动变量啊,啊!啊啊!该不会是堆栈溢出了吧!

        添加一个static上去(成为静态变量,当然也可以用malloc,不过频繁申请释放也不好),编译、刷机,OK了。

        这就明白了,由于这是个自动变量,增大了它之后堆栈溢出了。

EC200U-CN是啥

        移远通讯出品的4G解决方案,单芯片,支持串口(和其它),做4G数采基本就是这个方案最小了。遗憾是不支持以太网,不能对基于以太网的设备做数采(或许是因为既然能拉网线,走4G就没什么理由了)。

关于堆栈和堆栈溢出

        程序里的东西一般在这么几个地方:

  • 程序代码里,比如静态变量、全局变量、字符串常量
  • 堆里,malloc和new出来的,所谓动态内存管理
  • 栈里,函数里面直接写的,不是static的,“栈”也叫“堆栈”

        程序代码里的究竟是放在哪里不好说,反正也干预不了。

        堆和栈是自由空间,堆一般从下往上增长,栈则从上往下增长(输出一下自动变量的地址就明白了)。

        堆没有特别的大小限制,堆上申请不到内存就是内存耗尽了。

        栈的大小则受到系统限制,每个线程都有自己的堆栈,堆栈有最大大小限制,超出就挂了。这就是堆栈溢出。

栈有多大

        具体值不一定。我遇到过一些堆栈溢出的,比如某小型机上我放了6M的自动变量,结果就溢出了。这次这个是单片机(SOC),那个结构才3K就溢出了(我改了程序之后读写10K的结构也没问题了)。

        windows上可能是1M吧。应该可以在编译的时候设置的吧。

编程原则:大变量不可使用栈

闲话

        捣腾半辈子C++,近年来努力往C#上爬呢,一不留神发现世界还是C的。如果再来个汇编的,那可是真是回到原点了。


(这里是结束)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/602223
推荐阅读
相关标签
  

闽ICP备14008679号