国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Alignment trap 解決方法

2019-11-10 21:05:29
字體:
供稿:網(wǎng)友
前幾天交叉編譯crtmpserver到arm9下。編譯通過,但是運行的時候,總是提示Alignment trap,但是并不影響程序的運行。這依然很令人不爽,因為不知道是什么原因引起的,這就像一顆定時炸彈一樣,一定要解決。    修改makefile,加入-ggdb,去掉編譯優(yōu)化,重新編譯。編譯完畢,在gdb下運行,依然提示Alignment trap,并且gdb沒有任何反應(yīng)。按照設(shè)想,操作系統(tǒng)應(yīng)該能捕獲到這個錯誤,然后通過信號的方式傳遞給gdb,gdb再中斷停下來。但是事實上并沒有按照我的設(shè)想運行,為什么呢?通過查找資料,發(fā)現(xiàn)cpu在處理內(nèi)存對齊的時候,有幾種方式可以設(shè)置。cat /PRoc/cpu/alignmentUser:           1System:         0Skipped:        0Half:           0Word          1DWord:          0Multi:          0User faults:    3 (fixup+warn)    我的嵌入式linux系統(tǒng)下的默認處理方式是第3級處理方式:修復(fù)+警告。0 - ignore1 - warn2 - fixup3 - fixup+warn4 - signal5 - signal+warn (需要這個)    于是修改為:echo 5 > /proc/cpu/alignment,這樣就會給內(nèi)核一個信號。再在gdb下面重新運行./rtmpserver ./rtmpserver.lua,果然gdb捕獲到該信息,然后bt,查看出現(xiàn)問題的代碼:
_currentFPVersion = ntohl(*((uint32_t *) (GETIBPOINTER(buffer) + 4))); //----MARKED-LONG---原來是在強制類型轉(zhuǎn)換讀取內(nèi)存的時候出現(xiàn)了錯誤,于是修改為: 
uint32_t uTemp = 0;   memcpy(&uTemp,GETIBPOINTER(buffer) + 4,sizeof(uint32_t)); _currentFPVersion = ntohl(uTemp);     再重新編譯,運行,果然煩人的Alignment trap消失了。這也提醒我們,平時在寫代碼的時候,在內(nèi)存訪問上,盡量使用memcmp,memcpy,memset等函數(shù),而不要為了方便,直接對指針內(nèi)容進行訪問。這樣的代碼在x86上可能沒問題,但是運行到arm上,就可能會出問題。關(guān)于為什么在arm上會出現(xiàn)Alignment trap,可以參考http://hi.baidu.com/simplejoy/blog/item/cf456c8b1549e617c8fc7ad6.html
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 桃江县| 油尖旺区| 大港区| 土默特右旗| 如皋市| 上栗县| 明水县| 寻甸| 连江县| 布尔津县| 湖北省| 凤山市| 芦山县| 高雄市| 赤城县| 林甸县| 进贤县| 涟水县| 彭阳县| 隆德县| 汉川市| 郎溪县| 鄂托克前旗| 轮台县| 石家庄市| 永安市| 波密县| 张家港市| 湾仔区| 通化县| 离岛区| 内丘县| 亳州市| 年辖:市辖区| 长春市| 长丰县| 新营市| 山丹县| 汾西县| 陇川县| 静安区|