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

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

Alignment trap 解決方法

2019-11-11 00:31:59
字體:
供稿:網(wǎng)友
前幾天交叉編譯crtmpserver到arm9下。編譯通過,但是運(yùn)行的時(shí)候,總是提示Alignment trap,但是并不影響程序的運(yùn)行。這依然很令人不爽,因?yàn)椴恢朗鞘裁丛蛞鸬模@就像一顆定時(shí)炸彈一樣,一定要解決。    修改makefile,加入-ggdb,去掉編譯優(yōu)化,重新編譯。編譯完畢,在gdb下運(yùn)行,依然提示Alignment trap,并且gdb沒有任何反應(yīng)。按照設(shè)想,操作系統(tǒng)應(yīng)該能捕獲到這個(gè)錯(cuò)誤,然后通過信號(hào)的方式傳遞給gdb,gdb再中斷停下來。但是事實(shí)上并沒有按照我的設(shè)想運(yùn)行,為什么呢?通過查找資料,發(fā)現(xiàn)cpu在處理內(nèi)存對(duì)齊的時(shí)候,有幾種方式可以設(shè)置。cat /PRoc/cpu/alignmentUser:           1System:         0Skipped:        0Half:           0Word          1DWord:          0Multi:          0User faults:    3 (fixup+warn)    我的嵌入式linux系統(tǒng)下的默認(rèn)處理方式是第3級(jí)處理方式:修復(fù)+警告。0 - ignore1 - warn2 - fixup3 - fixup+warn4 - signal5 - signal+warn (需要這個(gè))    于是修改為:echo 5 > /proc/cpu/alignment,這樣就會(huì)給內(nèi)核一個(gè)信號(hào)。再在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)存的時(shí)候出現(xiàn)了錯(cuò)誤,于是修改為: 
uint32_t uTemp = 0;   memcpy(&uTemp,GETIBPOINTER(buffer) + 4,sizeof(uint32_t)); _currentFPVersion = ntohl(uTemp);     再重新編譯,運(yùn)行,果然煩人的Alignment trap消失了。這也提醒我們,平時(shí)在寫代碼的時(shí)候,在內(nèi)存訪問上,盡量使用memcmp,memcpy,memset等函數(shù),而不要為了方便,直接對(duì)指針內(nèi)容進(jìn)行訪問。這樣的代碼在x86上可能沒問題,但是運(yùn)行到arm上,就可能會(huì)出問題。關(guān)于為什么在arm上會(huì)出現(xiàn)Alignment trap,可以參考http://hi.baidu.com/simplejoy/blog/item/cf456c8b1549e617c8fc7ad6.html
上一篇:2.7小記

下一篇:IO流_IO流概述及分類

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 汉川市| 墨脱县| 曲松县| 桓仁| 江门市| 靖安县| 金乡县| 遵义市| 长兴县| 师宗县| 巴彦县| 周口市| 新丰县| 景宁| 凤山县| 福鼎市| 兴国县| 辽中县| 望都县| 遵义县| 湘潭县| 当涂县| 黄平县| 洞头县| 鄯善县| 青阳县| 大英县| 娱乐| 泗阳县| 秭归县| 石景山区| 长乐市| 柳河县| 樟树市| 莫力| 双桥区| 长阳| 达日县| 开封县| 宾阳县| 康定县|