【发布时间】:2018-01-26 15:07:03
【问题描述】:
我在尝试调试看似非常奇怪的行为时遇到了一些问题。例如,我们有:
static const char* LOG_FORMAT = "0x%02x,%.5f,";
并且指针没有明显的原因发生变化。有时是垃圾,有时是代码中其他地方定义的其他常量字符串(或部分)。我们偶尔也会看到代码跳转到不应该运行的不同部分(状态变量似乎在没有被要求的情况下更改)。有 2 或 3 种常见的故障模式,它们似乎是随机发生的。这是一个相对较大的代码库,添加或删除某些部分会改变故障行为(或完全删除它),即使这些部分从未被引用。
目前最好的理论是,这是一个与内存相关的问题,因为我们已经用细齿梳了解了最近的所有变化,插入代码段以移动事物的简单行为似乎发生了变化或删除该行为。
调试此问题或类似问题的最佳方法是什么?发现调试器有时很有用,而在其他时候却没有用(但这可能是用户错误)。
补充说明。 ARM7,使用 Keil µVision 4 和 armcc v4.1 编译器。
【问题讨论】:
-
我使用 ARM7 已经有一段时间了,但我相信它有几个可用的硬件断点。设置一个以观察对
LOG_FORMAT指针变量的写入,然后查看修改它的内容。 -
对我来说肯定听起来像 UB,但你可能已经知道了。在不同但相同的硬件上出现同样奇怪的行为?
-
不是直接指向字符串,而是分配一些内存给 LOG_FORMAT,然后将字符串复制到 LOG_FORMAT。
-
您正在使用什么 c 库和/或这是在操作系统上吗?
-
如此广泛的损坏是堆栈溢出的典型(但不限于);您是否验证了足够的堆栈分配?您的问题只能是非法的建议或意见,不能就目前的情况得到明确的回答;当然教你使用调试器可能太宽泛了,但你至少可以检查堆栈内存(预先填充它)和 SP 寄存器值。