使用GDB調試core文件時的一些基本知識

一、錯誤代號
       一般出現core會由以下幾種類型的錯誤觸發生成:
       1.  SIGSEGV 段錯誤(信號11),說白了就是訪問了非法內存地址,無論是超出進程範圍的(地址越界)還是系統不存在的內存訪問(指針指向空)

       2.  SIGABRT 檢測異常(信號6) 調用了abort()函數導致,最常見的是對釋放的內存(free())再次進行釋放,或者內存分配失敗等原因的時候會觸發

       3.  SIGBUS本意是指總線錯誤(信號7),一般出現在當你訪問一段非法地址,並且這段地址物理上是不存在的。它類似於SIGSEGV,後者也是訪問非法地址,但是這個地址是               虛擬地址空間的地址,SIGBUS正好相反,由於某些機器上,物理空間存在不連續的情況,訪問到這些hole時,就會產生這個信號。硬件故障。

       4.  SIGILL 一般是硬件方面的問題,比如用%s格式直接輸出string類型的(沒有通過c_str()轉換)一般會導致這個信號並退出進程(一般編譯時就會提示cannot pass objects of               non-POD type …call will abort at runtime)。
二、環境查看
       查看堆棧信息:
              1. backstrace, 簡寫bt :打印當前的函數調用棧的所有信息
              2. frame[n],   簡寫f :切換到堆棧的第N層
              3. up/down,    在堆棧中向上或者向下移動
              4. info frame  打印更詳細的當前棧層的信息,包括一些寄存器的信息
              5. info args   打印出當前函數的參數名及值
              6. info locals 打印出當前函數中所有局部變量及其值
       查看變量:
                命令:print [/fmt] [expr]
                /fmt 是格式化的控制符,常用控制如下:
                x 16進制   u 無符號
                o 八進制   t 二進制
                a 地址     c 字符常量
                f 浮點數
               expr 可以是當前程序運行中的const常量、變量、函數等內容,但是不能使用程序中所定義的宏。
               表達式可以使用修飾符: var@n 表示將var看成長度是n的數組  注:這個我沒看懂是什麼意思
               usage: p /x array
              在GDB中可以隨時查看以下三種變量:
               1. 全局變量  2. 靜態變量  3.局部變量  
               對於全局變量與局部變量名字產生衝突時,一般會打印局部變量的內容。爲解決衝突,可以加入作用域修飾符:
          scope::var    查看作用域內的var變量,scope可以是文件或函數
         
      void Shop::Update()
      {
         static time_t tl = time(NULL);
      }

          可使用p 'Shop::Update'::t1進行查看
     查看內存:
       命令: x /nfu address  按照指定的格式查看內存數據
        n 是一個正整數,表示顯示的個數
        f 表示顯示的格式,參考之前的print的格式控制。
          如果地址所指的是字符串,那麼格式可以是s, 如果地址是指令地址,那麼格式可以是i
        u 表示從當前地址往後每個請求的字節數,如果不指定默認是4字節,b表示單字節,h表示雙字節,w表示四字節,g表示八字節
        例如命令:x /3xw 0xc8c9f90表示,從內存地址0xc8c9f90讀取內容,以四字節爲單位,連續讀取三個單位,並且按16進制顯示。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章