c - 调试 ARM7 内存问题

标签 c embedded arm7 armcc

我在尝试调试一些看起来非常奇怪的行为时遇到了一些问题。例如,我们有:

static const char* LOG_FORMAT = "0x%02x,%.5f,";

并且指针无明显原因地发生变化。有时是垃圾,有时是代码中其他地方定义的其他常量字符串(或一部分)。我们偶尔也会看到代码跳转到不应该运行的不同部分(状态变量似乎在没有被要求的情况下发生了变化)。有 2 或 3 种常见的故障模式,并且它们似乎是随机发生的。它是一个相对较大的代码库,添加或删除某些部分会更改故障行为(或完全删除它),即使这些部分从未被引用。

目前最好的理论是,这是一个与内存相关的问题,因为我们已经仔细梳理了所有最近的更改,并且插入代码段来移动事​​物的简单行为似乎会发生变化或删除该行为。

调试此问题或类似问题的最佳方法是什么?发现调试器有时很有用,但有时则不然(但这可能是用户错误)。

进一步说明。 ARM7,使用Keil µVision 4 和armcc v4.1 编译器。

最佳答案

这意味着程序中的某个地方存在指针错误/内存损坏...这可能是由很多不同的原因引起的。

发现这个问题的最简单方法是运行程序直到 main 开始,然后向变量添加“写入”断点。这应该直接指出有问题的代码。

一个可能的原因是堆栈溢出,即堆栈被放置在错误的内存位置,因此一旦溢出,它就会开始覆盖 .data.bss。请参阅this article

您可以通过在启动时将所有堆栈内存设置为已知值(例如0xAA)来调试堆栈溢出,让程序运行一段时间,尝试将其暴露给尽可能多的用例,然后中断并检查堆栈的内存,看看已知值仍然保留在多深的地方。如果这接近堆栈末尾,则很可能出现堆栈溢出。

关于c - 调试 ARM7 内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45748003/

相关文章:

c++ - 嵌入式环境中的STL

ios - 架构 armv 的 undefined symbol

c++ - 条件中的 Switch 语句和 & 号

c++ - 如何获取过滤器驱动程序中当前进程镜像文件的全名?

c++ - 如何通知我窗口已激活?

c - "binary"在设备驱动中是什么意思?

char ** 然后取消对 char * 的引用

c - 当我从目录打印文件时,为什么会出现点 ("."和 "..")?

objective-c - iOS NSInvocation setArgument : atIndex: does not work with struct on ARM builds

ios - 在 arm7s 上运行 arm7 内置的 iOS SDK