我在嵌入式环境中检测到内存损坏(我的程序在带有专有操作系统的机顶盒上运行).但我无法得到它的根本原因.在多次启动和退出应用程序的压力测试之后检测到内存损坏本身.因为腐败变量每次启动应用程序时都会更改它的地址,所以我无法设置内存断点,是否有任何想法可以找出这种损坏的根本原因?
(内存断点是当环境改变给定内存地址的值时启动的断点)
另请注意,我的所有软件都是使用C语言开发的.
谢谢你的帮助.
这些在嵌入式系统上总是很难解决,并且没有简单的答案.一些技巧:
查看内存被损坏的值.这可以给出明确的暗示.
查看内存损坏旁边的数据结构.
查看内存损坏中是否存在模式.它总是在类似的地址吗?
查看是否可以在运行时设置内存断点.
嵌入式系统是否允许将内存区域沙箱化?设置沙箱以保护您的数据存储器.
祝好运!
数据存储在哪里,两个过程如何访问数据?
如果结构是在堆外分配的,请尝试分配更大的块,并在结构前后放置较大的保护区域。这应该使您了解是否是周围堆分配中的一个已超出与您的结构相同的分配。如果您发现结构周围的内存未受影响,并且仅结构本身已损坏,则表明该损坏是由对您的结构位置有一定了解的某种原因引起的,而不是由随机内存造成的。
如果该结构位于数据部分中,请检查链接器映射输出以确定该结构附近还存在哪些其他数据。检查这些结构是否也已损坏,引入防护区域,如果强制将结构移动到其他位置,请检查问题是否在结构后面。这再次表明损坏是否是由了解您的结构位置的东西引起的。
您还可以通过将数据从堆切换到数据段或反之亦然来测试。
如果在将结构移到其他位置或引入保护区域后发现该结构不再损坏,则应检查链接器映射或跟踪堆以确定附近还有其他数据,并检查对这些区域的访问以防止缓冲区溢出。
但是,您可能会发现问题所在的位置确实与结构有关。如果是这种情况,请审核围绕该结构的引用的所有代码。每次访问前后都要检查内容。
若要检查损坏是否是由另一个进程或中断处理程序引起的,请在每个ISR被调用之前和之后,将钩子添加到每个任务开关。挂钩应检查内容是否已损坏。如果有,您将能够确定哪个流程或ISR负责。
如果将结构读取到本地进程堆栈上,请尝试增加进程堆栈并检查是否未发生数组溢出等情况。即使没有读入堆栈,也可能在某个时候在堆栈上有指向它的指针。检查附近调用的所有子功能是否存在堆栈问题或类似问题,这些问题可能导致不相关的代码块错误地使用了指针。
还应考虑编译器或RTOS是否可能出错。尝试关闭编译器优化,然后检查生成的代码。同样,请考虑是否可能是由于专有RTOS中的上下文切换错误所致。
最后,如果您要与其他硬件设备或CPU共享内存,并且启用了数据缓存,请确保使用未缓存的访问或类似策略来解决此问题。