首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试内存问题ARM7

调试内存问题ARM7
EN

Stack Overflow用户
提问于 2017-08-18 11:21:31
回答 2查看 70关注 0票数 0

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

代码语言:javascript
复制
static const char* LOG_FORMAT = "0x%02x,%.5f,";

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

目前最好的理论是,这是一个与记忆相关的问题,因为我们已经仔细梳理了所有最近的变化,插入代码段来移动东西的简单行为似乎会改变或删除行为。

调试此问题或类似问题的最佳方法是什么?我发现调试器有时很有用,但在其他时候却没有用(但这可能是用户的错误)。

进一步的注意事项。ARM7,使用KeilµVision 4和armcc v4.1编译器。

EN

回答 2

Stack Overflow用户

发布于 2017-08-18 17:49:20

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

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2017-08-24 04:14:28

这看起来像是堆栈未对齐的问题。您的堆栈可能在单字(4字节)边界上对齐,而不是在双字(8字节)边界上对齐。

这就是为什么删除和添加不相关的部分会导致不同的行为。堆栈从对齐到未对齐取决于它之前有多少数据。

损坏的格式说明符是另一个线索。在调用可变函数之前,未对齐的堆栈通常不会造成任何问题--特别是传递给需要双字对齐的值的函数。

要对此进行调试,您应该在调用printf (或使用格式说明符的任何函数)时设置断点,并查看堆栈指针。如果SP没有在8字节边界上对齐,那么问题就出现了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45748003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档