国产探花免费观看_亚洲丰满少妇自慰呻吟_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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 娄烦县| 祁门县| 南城县| 屏山县| 会同县| 正安县| 洪江市| 罗城| 武功县| 大安市| 喀什市| 荆州市| 富蕴县| 海伦市| 丰都县| 潞西市| 来凤县| 渭源县| 油尖旺区| 正镶白旗| 盘锦市| 登封市| 朝阳区| 客服| 香格里拉县| 达拉特旗| 华池县| 大庆市| 长寿区| 金川县| 黔西| 龙江县| 云梦县| 富川| 连州市| 伊春市| 上虞市| 黄浦区| 封丘县| 菏泽市| 会昌县|