簡體   English   中英

“對准陷阱”錯誤是什么意思?

[英]What does an “alignment trap” error means?

我的一個朋友在嘗試調試開始顯示“對齊陷阱”錯誤的代碼時遇到了一個大問題。 當特定功能訪問全局結構時,就會發生此問題。

在網上進行了一些研究之后,仍然不清楚“對准陷阱”是什么意思。 有人可以特別注意通常導致對齊陷阱的原因以及解決該問題的方式的解釋(不僅就如何使用調試器而言,還包括問題本身)?

所有這些都在帶有嵌入式Linux的ARM處理器(OMAP L138)中以C代碼完成。

注意:我並不是想通過此答案獲得特定於錯誤的解決方案建議,但是,正如問題標題所暗示的那樣,您應該理解“對齊陷阱”錯誤的含義。 這就是為什么我不打算放置源代碼之類的原因。

它特定於操作系統和處理器(也特定於ABI )。

您有一些內存損壞內存泄漏緩沖區溢出等問題,或者正在取消引用一些錯誤的指針(未初始化或計算錯誤),例如指向double的指針,該指針不是8的倍數(或on在某些體系結構中,指向int的指針(不是4的倍數),或者您正在跳轉到某個無效地址(例如,指向錯誤的函數指針)。

在Linux上,我建議使用gcc -Wall -g進行編譯,並使用調試器( gdb )和valgrind 您可能對使用-fsanitize=address-fsanitize=undefined編譯標志(對於GCC 4.9)感興趣。 他們都檢測(修改)生成的代碼。

閱讀有關未定義行為的信息 你一定有。

只要進行未對齊訪問,ARM就會觸發對齊陷阱。 什么是未對齊訪問? 在訪問多字節值時,其指針不是其對齊方式的倍數,例如,通過取消引用不是4的倍數的指針來訪問uint32_t時。

如果具有__attribute__((packed))數據結構,則可以獲取它們:

struct foo {
    uint8_t a;
    uint32_t b;
} __attribute__((packed));

b訪問將是未對齊的,因此將導致對齊陷阱。 你必須memcpy數據為對齊值,然后訪問它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM