• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            那誰(shuí)的技術(shù)博客

            感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
            隨筆 - 210, 文章 - 0, 評(píng)論 - 1183, 引用 - 0
            數(shù)據(jù)加載中……

            [經(jīng)驗(yàn)教訓(xùn)總結(jié)]協(xié)議包頭結(jié)構(gòu)體定義不嚴(yán)謹(jǐn)造成的錯(cuò)誤

            今天遇到一個(gè)問(wèn)題,調(diào)試了一天.

            大致描述一下,移植一個(gè)開(kāi)源項(xiàng)目的代碼,原來(lái)在mips平臺(tái)上運(yùn)行正常,后來(lái)到arm平臺(tái)的機(jī)器上運(yùn)行,結(jié)果運(yùn)行時(shí)出錯(cuò)了.

            一般的,這樣的問(wèn)題,腦子里面第一下的反應(yīng)就是由于字節(jié)序問(wèn)題造成的.

            我起初也是這么想的.因?yàn)閺某鲥e(cuò)的現(xiàn)象來(lái)看,是某個(gè)字段不符合要求造成的出錯(cuò).于是沿著這個(gè)思路去找BUG.抓包來(lái)分析,看上去也是這樣的.但是,追蹤的過(guò)程中發(fā)現(xiàn),有多次收發(fā)報(bào)文的過(guò)程,這個(gè)字段,或者說(shuō)擁有這個(gè)字段的結(jié)構(gòu)體在多處都有使用,改了一處,在別的地方其它字段又有報(bào)錯(cuò).

            回頭看代碼,發(fā)現(xiàn)在最開(kāi)始解析包頭的時(shí)候,已經(jīng)造成了緊跟著包頭的某個(gè)字段出現(xiàn)異常,于是,想到是不是在不同的平臺(tái)上,sizeof(某結(jié)構(gòu)體)的數(shù)值不一樣造成,要驗(yàn)證這一點(diǎn),給包頭結(jié)構(gòu)體的定義加上嚴(yán)格按照一個(gè)字節(jié)對(duì)齊的限制,重新運(yùn)行程序,可以了.

            最后再來(lái)稍微詳細(xì)一些看這個(gè)問(wèn)題,假設(shè)包頭結(jié)構(gòu)體的定義是:
            typedef unsigned short u16;

            struct header
            {
                u16 a;
                u16 b;
                u16 c;
            };
            如果解析的時(shí)候,sizeof(struct header) != sizeof(u16) * 3,那么使用sizeof(struct header)解析接收到緩沖區(qū)的數(shù)據(jù)就會(huì)出現(xiàn)問(wèn)題,因?yàn)樗鼤?huì)對(duì)緊跟著的數(shù)據(jù)也造成影響.程序的異常正是源于此.在代碼的處理中,首先接收包頭,對(duì)包頭的數(shù)據(jù)進(jìn)行了字節(jié)序轉(zhuǎn)換,然后,又對(duì)緊挨著包頭的結(jié)構(gòu)體進(jìn)行了相同的字節(jié)序轉(zhuǎn)換,由于包頭結(jié)構(gòu)體的字節(jié)序轉(zhuǎn)換同時(shí)影響了緊挨著的結(jié)構(gòu)體中的數(shù)據(jù),所以這些數(shù)據(jù)實(shí)際上被進(jìn)行了兩次的字節(jié)序轉(zhuǎn)換,這才造成了這個(gè)問(wèn)題"看上去"是字節(jié)序轉(zhuǎn)換不當(dāng)造成的"表面原因",如果跟著這個(gè)原因繼續(xù)跟蹤下去,以這個(gè)思路解決問(wèn)題,治標(biāo)而不治本.

            總結(jié):
            1. 收發(fā)數(shù)據(jù)的結(jié)構(gòu)體定義需要嚴(yán)謹(jǐn)一些,如果不能確定如何對(duì)齊,最好自己定義一個(gè)對(duì)齊的標(biāo)準(zhǔn).
            2. 經(jīng)驗(yàn)有的時(shí)候也不見(jiàn)得就是好事,有時(shí)候會(huì)讓自己陷入思維定式的怪圈,比如在這個(gè)問(wèn)題的處理上,由于問(wèn)題在切換了硬件平臺(tái)的時(shí)候才出現(xiàn),正好又是兩個(gè)字節(jié)序不一樣的硬件平臺(tái),所以經(jīng)驗(yàn)將我的思路導(dǎo)向了字節(jié)序不正確這個(gè)方向上.



            posted on 2009-10-15 20:32 那誰(shuí) 閱讀(5251) 評(píng)論(6)  編輯 收藏 引用 所屬分類: 經(jīng)驗(yàn)教訓(xùn)

            評(píng)論

            # re: [經(jīng)驗(yàn)教訓(xùn)總結(jié)]協(xié)議包頭結(jié)構(gòu)體定義不嚴(yán)謹(jǐn)造成的錯(cuò)誤  回復(fù)  更多評(píng)論   

            有假設(shè)就寫(xiě)到代碼里嘛。
            隨便找個(gè)編譯單元:
            static char assume[sizeof(header)==sizeof(u16)*3?1:-1];

            或者就在header下方寫(xiě):
            typedef int assume[sizeof(header)==sizeof(u16)*3?1:-1]];

            2009-10-15 23:35 | OwnWaterloo

            # re: [經(jīng)驗(yàn)教訓(xùn)總結(jié)]協(xié)議包頭結(jié)構(gòu)體定義不嚴(yán)謹(jǐn)造成的錯(cuò)誤  回復(fù)  更多評(píng)論   

            按照一字節(jié)對(duì)齊,不要使用編譯器默認(rèn)的。
            2009-10-16 09:00 | guest

            # re: [經(jīng)驗(yàn)教訓(xùn)總結(jié)]協(xié)議包頭結(jié)構(gòu)體定義不嚴(yán)謹(jǐn)造成的錯(cuò)誤[未登錄](méi)  回復(fù)  更多評(píng)論   

            這種時(shí)候最好加上一個(gè)#pragma pack命令,對(duì)應(yīng)于gcc好像是__attribute吧。
            2009-10-16 17:31 | 欲三更

            # re: [經(jīng)驗(yàn)教訓(xùn)總結(jié)]協(xié)議包頭結(jié)構(gòu)體定義不嚴(yán)謹(jǐn)造成的錯(cuò)誤  回復(fù)  更多評(píng)論   

            學(xué)習(xí)分享!
            2009-10-18 19:59 | 伊莎貝兒女裝

            # re: [經(jīng)驗(yàn)教訓(xùn)總結(jié)]協(xié)議包頭結(jié)構(gòu)體定義不嚴(yán)謹(jǐn)造成的錯(cuò)誤  回復(fù)  更多評(píng)論   

            建議不要與語(yǔ)言,CPU相關(guān)。否則,你下次,還依然還要被教訓(xùn)
            2009-10-18 21:35 | zdhsoft

            # re: [經(jīng)驗(yàn)教訓(xùn)總結(jié)]協(xié)議包頭結(jié)構(gòu)體定義不嚴(yán)謹(jǐn)造成的錯(cuò)誤  回復(fù)  更多評(píng)論   

            不太明白,你一個(gè)結(jié)構(gòu)中三個(gè)成員都是相同類型的,什么情況下會(huì)出現(xiàn)整個(gè)結(jié)構(gòu)的大小不等于成員類型大小的3倍?
            2009-11-18 19:44 | MaTox
            婷婷久久综合| 久久国产欧美日韩精品| 久久亚洲天堂| 日韩精品久久久肉伦网站| 国产精品无码久久综合| 伊人色综合久久天天| 亚洲人成无码www久久久| 久久午夜羞羞影院免费观看| 夜夜亚洲天天久久| 久久久久久国产精品美女| 欧美777精品久久久久网| 一本久久综合亚洲鲁鲁五月天| 久久久精品国产sm调教网站| 久久综合狠狠综合久久97色| 久久亚洲AV成人出白浆无码国产 | 国产91久久综合| 婷婷五月深深久久精品| 青青热久久国产久精品 | 久久精品一本到99热免费| 久久久久久a亚洲欧洲aⅴ| 久久精品国产乱子伦| 久久九九久精品国产| 免费国产99久久久香蕉| 国内精品久久久久久久97牛牛| 久久香综合精品久久伊人| 亚洲国产成人久久笫一页| 国产69精品久久久久9999| 国产精品99精品久久免费| 久久亚洲AV成人出白浆无码国产| 久久精品国产日本波多野结衣| 色综合久久88色综合天天 | 韩国三级中文字幕hd久久精品| 亚洲一本综合久久| 久久被窝电影亚洲爽爽爽| 久久精品国产亚洲综合色| 成人久久精品一区二区三区 | 久久99热这里只有精品国产| 国产免费久久精品99久久| 久久精品国产亚洲7777| 看全色黄大色大片免费久久久 | 99热成人精品免费久久|