一般出現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進制顯示。