历史上的今天
今天是:2025年03月11日(星期二)
2019年03月11日 | stm32踩内存的问题
2019-03-11 来源:eefocus
问题背景
最近重构代码的时候发现一个踩内存的bug,当时没有时间将这个问题记录下来,这一次简单记录一下。
问题描述
经过打印发现代码中的数据会被莫名的改掉,全局搜索发现没有地方修改这个结构体。这个问题随机出现,确认代码被随机踩掉了数据。
过程分析
1.已经确认是内存被踩,首先看map文件,发现这个结构体附近是,另外一个线程的堆栈,有可能是堆栈越界了。经过分析发现,这个县城的堆栈剩余还是比较多的不会出现这种情况,排除。
2.那说明很有可能是被空指针踩掉了数据。这样问题一时就不好分析。因此首先,在被踩的这个结构体前面放上一个很大的空数组。查找被采数据的内容。
3.发现被踩的数据长度,很固定都是22个字节,这个长度和避障传感器上来的数据帧长度很接近,所以去查看驱动代码。但是没有发现问题。
4.然后去看被踩数据的内容,发现总是有0a0f,这个数据很特别,因为这个是我们回复服务器的数据的帧头。因此确认回复服务器部分的代码肯定有问题。
5.经过查找发现,有使用未指向任何内容的空指针。并且后面有代码使用memcpy来复制数据给这个地址,造成踩内存的情况。而这个函数,重构的时候直接从老代码粘贴过来的,谁也没有关心过这部分的代码,结果就偏偏这一部分出现了问题。
总结
写代码一定要注意,写出优秀的代码应该是一种追求,而不是完成工作。希望自己的代码精巧玲珑,稳定可靠,提高要求。
史海拾趣
|
数字系统通常划分为信息处理单元和控制单元。信息单元主要进行信息的传输和运算, 而控制单元的主要任务是控制信息处理单元的微操作的顺序。控制单元的实现方式有: 有限状态机、控制寄存器和微代码控制器等。有限状态机在时间尺度上对其控制信号进行 ...… 查看全部问答> |
|
大家好!! 小弟最近在弄idea6410。系统设置的是UART0为调试串口。。我想把UART0修改成普通串口,把UART1修改成调试串口。 我在OAL的debug.c中找到了调试串口的初始化函数OEMInitDebugSerial 贴一些代码: …………………… [code] #if ...… 查看全部问答> |
|
wince6.0移植 ActiveSync连接不上 奉上100分!!! 首先说明:硬件是2440,wince5.0运行很好,即可以连接ActiveSync4.5 现象:当用USB连接PC机与设备时, 1.在PC机上的计算机管理器界面可以显示 Anchor USB EZ-Link Cable 驱动,这说明PC机 USB驱动没问题 wince6.0 下的USB驱动也是 ...… 查看全部问答> |
|
WinCE5.0 Microsoft ActiveSync 连接是无法发现新设备 我是新手,初步接触时遇到上述问题(WinCE5.0 Microsoft ActiveSync 连接是无法发现新设备),我用的是致远2410实验箱,根据实验书上的步骤进行的,安装的是Microsoft ActiveSync4.2版本,与PC机进行USB连接时,无法发现新设备,是USB驱动的问题吗 ...… 查看全部问答> |
|
首先说下,我的WINCE系统是支持WinSock2的,可以用WinSock2库的函数,在我的程序中想要创建多址广播套接字 创建函数:SOCKET WSASocket( int af, int type, int protocol, LPWSAPROTOCOL_INF ...… 查看全部问答> |
|
随机生成的6位16进制的数据,产生的校验码,怎么推算出它的计算公式??? 已知的一组数据为 6位数据 校验码 1AC855 8C 524446 5B 7C6306 12 90CE32 67 BBD5E9 8C 38E29A 4B 3E0003 36 6A8F1D F3 D58651 09 132850 60 … 查看全部问答> |
|
我们前一段时间花了大力气在VC6.0上做了个程序,现在要把它移植到EVC下面.对话框等控件应该没有什么问题了,但是出现了下面的问题 pMyCtrlCard = new CMyCtrlcard; //这一行没有问题. //打 ...… 查看全部问答> |




