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

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

Alignment trap 解決方法

2019-11-10 21:31:47
字體:
供稿:網(wǎng)友
前幾天交叉編譯crtmpserver到arm9下。編譯通過,但是運(yùn)行的時候,總是提示Alignment trap,但是并不影響程序的運(yùn)行。這依然很令人不爽,因?yàn)椴恢朗鞘裁丛蛞鸬模@就像一顆定時炸彈一樣,一定要解決。    修改makefile,加入-ggdb,去掉編譯優(yōu)化,重新編譯。編譯完畢,在gdb下運(yùn)行,依然提示Alignment trap,并且gdb沒有任何反應(yīng)。按照設(shè)想,操作系統(tǒng)應(yīng)該能捕獲到這個錯誤,然后通過信號的方式傳遞給gdb,gdb再中斷停下來。但是事實(shí)上并沒有按照我的設(shè)想運(yùn)行,為什么呢?通過查找資料,發(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)下的默認(rèn)處理方式是第3級處理方式:修復(fù)+警告。0 - ignore1 - warn2 - fixup3 - fixup+warn4 - signal5 - signal+warn (需要這個)    于是修改為:echo 5 > /proc/cpu/alignment,這樣就會給內(nèi)核一個信號。再在gdb下面重新運(yùn)行./rtmpserver ./rtmpserver.lua,果然gdb捕獲到該信息,然后bt,查看出現(xiàn)問題的代碼:
_currentFPVersion = ntohl(*((uint32_t *) (GETIBPOINTER(buffer) + 4))); //----MARKED-LONG---原來是在強(qiáng)制類型轉(zhuǎn)換讀取內(nèi)存的時候出現(xiàn)了錯誤,于是修改為: 
uint32_t uTemp = 0;   memcpy(&uTemp,GETIBPOINTER(buffer) + 4,sizeof(uint32_t)); _currentFPVersion = ntohl(uTemp);     再重新編譯,運(yùn)行,果然煩人的Alignment trap消失了。這也提醒我們,平時在寫代碼的時候,在內(nèi)存訪問上,盡量使用memcmp,memcpy,memset等函數(shù),而不要為了方便,直接對指針內(nèi)容進(jìn)行訪問。這樣的代碼在x86上可能沒問題,但是運(yùn)行到arm上,就可能會出問題。關(guān)于為什么在arm上會出現(xiàn)Alignment trap,可以參考http://hi.baidu.com/simplejoy/blog/item/cf456c8b1549e617c8fc7ad6.html
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 乐清市| 安阳县| 瑞昌市| 永德县| 淳安县| 镇沅| 安徽省| 井研县| 阳谷县| 金塔县| 白山市| 神农架林区| 扬中市| 通化县| 英德市| 阿拉善右旗| 通化市| 溆浦县| 安康市| 鲁山县| 永靖县| 耒阳市| 青田县| 南岸区| 万全县| 嘉义市| 象山县| 新民市| 调兵山市| 池州市| 土默特右旗| 富蕴县| 庆城县| 文化| 龙门县| 德格县| 蓬安县| 平塘县| 肃宁县| 德阳市| 垫江县|