赞
踩
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
目录
近日又捣腾一个C程序,别人写的,拿过来改。本来跑得挺好的,为了增加一点内容,我把一个主要数据结构增大了,然后就整个设备不停重启——是个硬件,EC200U-CN,移远的SOC。
还好能强刷嘛(短接两根线进入强刷模式),各种办法跟踪(这东西比较费劲,没有屏幕),发现读写文件时出的问题,有异常信息“Detected event: 0x9db00000”,啥意思呢?网上也没有太多信息。
是不是有大小限制呢?改成了分段读写,还是照常不停重启,但是终于从日志中发现有时候写成功的长度是不一样的,这大概说明不是读写文件的长度有限制(其实想想也应该明白,明明有更长的文件存在呢)。
继续瞎跟踪啊,添加更多日志,突然注意到函数里面有个主结构的自动变量啊,啊!啊啊!该不会是堆栈溢出了吧!
添加一个static上去(成为静态变量,当然也可以用malloc,不过频繁申请释放也不好),编译、刷机,OK了。
这就明白了,由于这是个自动变量,增大了它之后堆栈溢出了。
移远通讯出品的4G解决方案,单芯片,支持串口(和其它),做4G数采基本就是这个方案最小了。遗憾是不支持以太网,不能对基于以太网的设备做数采(或许是因为既然能拉网线,走4G就没什么理由了)。
程序里的东西一般在这么几个地方:
程序代码里的究竟是放在哪里不好说,反正也干预不了。
堆和栈是自由空间,堆一般从下往上增长,栈则从上往下增长(输出一下自动变量的地址就明白了)。
堆没有特别的大小限制,堆上申请不到内存就是内存耗尽了。
栈的大小则受到系统限制,每个线程都有自己的堆栈,堆栈有最大大小限制,超出就挂了。这就是堆栈溢出。
具体值不一定。我遇到过一些堆栈溢出的,比如某小型机上我放了6M的自动变量,结果就溢出了。这次这个是单片机(SOC),那个结构才3K就溢出了(我改了程序之后读写10K的结构也没问题了)。
windows上可能是1M吧。应该可以在编译的时候设置的吧。
捣腾半辈子C++,近年来努力往C#上爬呢,一不留神发现世界还是C的。如果再来个汇编的,那可是真是回到原点了。
(这里是结束)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。