我的一个朋友在尝试调试开始显示"对齐陷阱"的代码时遇到了一个大问题。错误。当特定函数访问全局结构时会发生此问题。
在对网络进行一些研究后,仍然不清楚对齐陷阱是什么?#34;意思是。有人可以给出一个解释,特别注意通常会导致对齐陷阱的问题以及解决问题的方法(不仅仅是关于如何使用调试器,还有问题本身)?
这一切都是在带有嵌入式Linux的ARM处理器(OMAP L138)的C代码中完成的。
注意:我没有尝试使用此答案获取特定于错误的解决方案建议,但是,正如问题标题所示,了解什么是"对齐陷阱& #34;错误意味着这就是我不打算放置源代码等的原因。
答案 0 :(得分:7)
它是特定于操作系统和处理器的(也是ABI特定的)。
您有一些memory corruption或memory leak或buffer overflow等等,或者您正在取消引用某些错误的指针(未初始化或错误计算) - 例如指向double
的指针,该指针不是8的倍数(或者,在某些体系结构上,指向int
的指针不是4的倍数),或者您可能跳转到某个无效地址(例如,一个糟糕的函数指针)。
在Linux上,我建议使用gcc -Wall -g
进行编译并使用调试器(gdb
)和valgrind。您可能对使用-fsanitize=address
或-fsanitize=undefined
编译标志(使用GCC 4.9)感兴趣。他们都对所生成的代码进行检测(如此修改)。
了解undefined behavior。你肯定有一些。
答案 1 :(得分:0)
每当进行未对齐访问时,对齐陷阱就会由ARM触发。什么是未对齐访问?在访问多字节值时,其指针不是其对齐方式的倍数,例如通过取消引用不是4的倍数的指针来访问uint32_t时。
如果您具有__attribute__((packed))
这样的数据结构,则可以获取它们:
struct foo {
uint8_t a;
uint32_t b;
} __attribute__((packed));
对b
的访问将是未对齐的,因此将导致对齐陷阱。您必须memcpy
将数据转换为对齐的值,然后再访问它。