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

首頁 > 學院 > 開發設計 > 正文

Alignment trap 解決方法

2019-11-10 22:28:49
字體:
來源:轉載
供稿:網友
前幾天交叉編譯crtmpserver到arm9下。編譯通過,但是運行的時候,總是提示Alignment trap,但是并不影響程序的運行。這依然很令人不爽,因為不知道是什么原因引起的,這就像一顆定時炸彈一樣,一定要解決。    修改makefile,加入-ggdb,去掉編譯優化,重新編譯。編譯完畢,在gdb下運行,依然提示Alignment trap,并且gdb沒有任何反應。按照設想,操作系統應該能捕獲到這個錯誤,然后通過信號的方式傳遞給gdb,gdb再中斷停下來。但是事實上并沒有按照我的設想運行,為什么呢?通過查找資料,發現cpu在處理內存對齊的時候,有幾種方式可以設置。cat /PRoc/cpu/alignmentUser:           1System:         0Skipped:        0Half:           0Word          1DWord:          0Multi:          0User faults:    3 (fixup+warn)    我的嵌入式linux系統下的默認處理方式是第3級處理方式:修復+警告。0 - ignore1 - warn2 - fixup3 - fixup+warn4 - signal5 - signal+warn (需要這個)    于是修改為:echo 5 > /proc/cpu/alignment,這樣就會給內核一個信號。再在gdb下面重新運行./rtmpserver ./rtmpserver.lua,果然gdb捕獲到該信息,然后bt,查看出現問題的代碼:
_currentFPVersion = ntohl(*((uint32_t *) (GETIBPOINTER(buffer) + 4))); //----MARKED-LONG---原來是在強制類型轉換讀取內存的時候出現了錯誤,于是修改為: 
uint32_t uTemp = 0;   memcpy(&uTemp,GETIBPOINTER(buffer) + 4,sizeof(uint32_t)); _currentFPVersion = ntohl(uTemp);     再重新編譯,運行,果然煩人的Alignment trap消失了。這也提醒我們,平時在寫代碼的時候,在內存訪問上,盡量使用memcmp,memcpy,memset等函數,而不要為了方便,直接對指針內容進行訪問。這樣的代碼在x86上可能沒問題,但是運行到arm上,就可能會出問題。關于為什么在arm上會出現Alignment trap,可以參考http://hi.baidu.com/simplejoy/blog/item/cf456c8b1549e617c8fc7ad6.html
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 霍邱县| 保康县| 潞城市| 乐亭县| 报价| 女性| 石楼县| 建水县| 岳普湖县| 缙云县| 肥乡县| 固阳县| 元朗区| 胶南市| 吉首市| 葫芦岛市| 花莲县| 乌鲁木齐县| 玉田县| 舟山市| 祁连县| 南京市| 陆丰市| 且末县| 磐石市| 奉贤区| 桦川县| 儋州市| 江陵县| 民权县| 奉新县| 渑池县| 肇州县| 伊金霍洛旗| 瑞安市| 崇信县| 乌兰浩特市| 天台县| 博白县| 赫章县| 湟源县|