我的一个朋友在调试开始显示“对齐陷阱”错误的代码时遇到了很大的问题。当一个全局结构被一个特定的函数访问时,这个问题就会发生。
在对网络进行了一些研究之后,仍然不清楚“对齐陷阱”意味着什么或者是什么。有人能给出一个解释,特别注意什么通常导致对齐陷阱,以及通常如何解决这个问题(不仅仅是在如何使用调试器方面,而且在问题本身方面)?
这一切都是用C代码在ARM处理器(OMAP L138)中与嵌入式Linux一起完成的。
注意:我并不是想通过这个答案得到一个特定于错误的解决方案建议,但是,正如问题标题所暗示的,理解“对齐陷阱”错误意味着什么。这就是为什么我不打算放一个源代码之类的。
发布于 2014-10-20 11:10:48
它是操作系统和处理器特定的( ABI也是特定的)。
您有一些内存损坏、内存泄漏或缓冲区溢出等.,或者您正在取消引用一些错误的指针(或者未初始化,或者计算错误)--例如,指向double的指针不是8的倍数(或者,在某些体系结构中,指向int的指针不是4的倍数),或者您正在跳转到某个无效地址(例如指向坏的函数指针)。
在Linux上,我建议使用gcc -Wall -g进行编译,并使用调试器(gdb)和缬磨。您可能对使用-fsanitize=address或-fsanitize=undefined编译标志感兴趣( GCC 4.9)。它们都检测(因此修改)生成的代码。
阅读关于未定义行为的文章。你肯定有一些。
发布于 2018-08-02 21:46:04
每当进行未对齐访问时,ARM就会触发对齐陷阱。什么是非对齐访问?当访问一个多字节值时,它的指针不是其对齐的倍数,例如,通过取消引用一个不是4的指针来访问uint32_t。
如果您有这样的__attribute__((packed))数据结构,就可以得到它们:
struct foo {
uint8_t a;
uint32_t b;
} __attribute__((packed));对b的访问将不对齐,因此将导致对齐陷阱。您必须将数据memcpy为对齐值,然后访问它。
https://stackoverflow.com/questions/26464030
复制相似问题