• <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>

            段錯誤造成的常見詭異宕機情況總結(中)

               上面一種情況是自己內存寫超了,寫到了用戶態別的結構所在的內存,特點就是core文件顯示 別處對象的內容亂七八糟,且一般是在對象析構時發生,這次講解一下,自己把自己寫壞的情況。
              1 /**
              2  *\author peakflys 
              3  *\brief 堆棧崩潰問題
              4  
            */
              5 #include <iostream>
              6 using namespace std;
              7 
              8 struct Temp
              9 {
             10     int a;
             11     unsigned char b[4];
             12 };
             13 
             14 class Test
             15 {
             16 public:
             17     void temp();
             18 private:
             19     void fill(unsigned char *data);
             20     Temp tt;
             21 };
             22 void Test::fill(unsigned char *data)
             23 {
             24     for(int i=0;i<20;++i)
             25     {
             26         data[i] = i;
             27         cout<<"data["<<i<<"]:\t"<<(void *)&data[i]<<endl;
             28     }
             29 }
             30 void Test::temp()
             31 {
             32     Temp t;
             33     fill((unsigned char *)&t);
             34 }
             35 
             36 int main()
             37 {
             38     Test *pt = new Test();
             39     pt->temp();
             40     delete pt;
             41     return 0;
             42 }
            運行結果:
            data[0]:        0x7fffa4a38c60
            data[1]:        0x7fffa4a38c61
            data[2]:        0x7fffa4a38c62
            data[3]:        0x7fffa4a38c63
            data[4]:        0x7fffa4a38c64
            data[5]:        0x7fffa4a38c65
            data[6]:        0x7fffa4a38c66
            data[7]:        0x7fffa4a38c67
            data[8]:        0x7fffa4a38c68
            data[9]:        0x7fffa4a38c69
            data[10]:       0x7fffa4a38c6a
            data[11]:       0x7fffa4a38c6b
            data[12]:       0x7fffa4a38c6c
            data[13]:       0x7fffa4a38c6d
            data[14]:       0x7fffa4a38c6e
            data[15]:       0x7fffa4a38c6f
            data[16]:       0x7fffa4a38c70
            data[17]:       0x7fffa4a38c71
            data[18]:       0x7fffa4a38c72
            data[19]:       0x7fffa4a38c73
            段錯誤 (core dumped)
            堆棧情況:
            Program terminated with signal 11, Segmentation fault.
            [New process 18836]
            #0  0x0000000000400a3e in main ()
            (gdb) bt
            #0  0x0000000000400a3e in main ()
            (gdb) 
            總結:temp成員函數在調用fill成員函數時通過thiscall方式調用,gcc具體實現是把this指針像普通參數一樣入棧傳過去,而VS是在定參的情況下,this指針通過ECX傳入,這個就是這次悲劇的禍根,通過gdb打印出來的情況是:
            (gdb) info fr
            Stack level 0, frame at 0x7fff49980a50:
             rip = 0x400975 in Test::fill(unsigned char*) (test.cpp:22); saved rip 0x400a56
             called by frame at 0x7fff49980a80
             source language c++.
             Arglist at 0x7fff49980a40, args: this=0x601280, data=0x3d9da611a0 "\203?\001\031?f\203;"
             Locals at 0x7fff49980a40, Previous frame's sp is 0x7fff49980a50
             Saved registers:
              rbp at 0x7fff49980a40, rip at 0x7fff49980a48
            (gdb) p &this
            $7 = (Test * const *) 0x7fff49980a20
            (gdb) p &data
            $8 = (unsigned char **) 0x7fff49980a18
            通過對data的持續寫最終導致棧地址寫到了this指針所在的棧內存,這樣再從那塊地址取this指針時,取的就不是this指針,最終從未知的“that指針”取數據,十有八九程序就掛了。
               這種情況出現在linux服務器上(確切的說是使用GCC編譯器編譯的程序上),特點就是 發生在類函數里,宕機位置不一定,每一次宕機 查看 類體對象內容也是錯亂的,并且 關鍵是 this指針發生了改變,打印其地址時很可能是無法訪問,預防方法還是邊界訪問檢查。
                結合上一例子來看,段錯誤宕機重點嫌疑對象就是數組!排查的時候首先在空間近鄰或者時間近鄰上查找。實際應用中這類錯誤可能會很隱蔽,例如內存寫超的代碼發生在某些庫代碼里,這種情況就要求 寫代碼時對自己所調用的庫函數 要大致了解 實現方法。總之,數組或者數組類指針是我們重點排查對象。
               未完待續……  peakflys

            posted on 2012-09-21 13:32 peakflys 閱讀(3960) 評論(2)  編輯 收藏 引用 所屬分類: 服務器

            評論

            # re: 段錯誤造成的常見詭異宕機情況總結(中) 2012-09-21 16:29 zuhd

            這種情況比較有意思  回復  更多評論   

            # re: 段錯誤造成的常見詭異宕機情況總結(中) 2014-05-08 11:35 samjiao

            這個地址可能給你誤解了
            (gdb) p &data
            $8 = (unsigned char **) 0x7fff49980a18
            這是指向地址的地址,往data寫內容是是寫到 0x7fff49980a18存放的地址上去,因此破壞的不是this指針。
            這種情況下如果有多重調用,破壞的是上級的堆棧結構。因此導致segment fault。
            你說的額數組是最大嫌疑非常有啟發。  回復  更多評論   

            <2012年9月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            導航

            統計

            公告

            人不淡定的時候,就愛表現出來,敲代碼如此,偶爾的靈感亦如此……

            常用鏈接

            留言簿(4)

            隨筆分類

            隨筆檔案

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            日本亚洲色大成网站WWW久久 | 久久99国产亚洲高清观看首页| 久久人人爽人人爽人人av东京热| 国内精品伊人久久久影院| 亚洲国产精品久久电影欧美| 精品999久久久久久中文字幕| 久久久久99精品成人片牛牛影视| 色天使久久综合网天天| 久久男人Av资源网站无码软件| 久久亚洲精品中文字幕三区| 欧美日韩精品久久免费| 久久婷婷综合中文字幕| 四虎国产精品成人免费久久| 国产精品久久久久久吹潮| 日本精品一区二区久久久| 99re这里只有精品热久久| 三级韩国一区久久二区综合| 久久精品aⅴ无码中文字字幕重口 久久精品a亚洲国产v高清不卡 | 精品国产乱码久久久久软件| 2021精品国产综合久久| 国产精品久久久久久久久久影院| 九九久久99综合一区二区| 亚洲精品无码专区久久久| 久久国产精品波多野结衣AV| 久久99精品国产麻豆| 香蕉久久久久久狠狠色| 久久99久久无码毛片一区二区 | 91精品国产综合久久香蕉| 亚洲综合伊人久久大杳蕉| 午夜福利91久久福利| 国产成人精品久久综合| 97r久久精品国产99国产精| 欧美熟妇另类久久久久久不卡| 亚洲欧美久久久久9999 | 久久久久女教师免费一区| 粉嫩小泬无遮挡久久久久久| 浪潮AV色综合久久天堂| 精品国产乱码久久久久软件| 欧美日韩精品久久久免费观看| 亚洲日韩欧美一区久久久久我 | 国产精品久久毛片完整版|