優化的**在printf或其它glibc函式處core
沒有檢查返回值的函式呼叫異常導致的異常
優化的**的計算異常的中間過程分析
棧溢位導致的core
區域性變數越界導致棧異常的core
通常除錯的**基本上都是在未開啟優化的情況下,各個變數都可以直接檢視,因此造成很多人除錯時基本上不會看暫存器,但是對於線上的生產環境,可能會因為效能的因素,需要開啟**優化,此時出現異常需要除錯時就通常需要檢視暫存器了,下列是gdb除錯中需要了解的暫存器。
在gdb除錯棧錯誤前,你需要了解下列的棧知識
棧異常導致的core是線上最常見的core原因之一,常見原因有:
find 0x7fffffffe000 0x7fffffffe4d0 0x7fffffffe4c0 3
其中查詢範圍的起始位址,和查詢的值這2個值可能不太理解為什麼是這2個值,因此補充下面的這張解釋圖說明下:
因為是在f1內越界訪問寫的f2內的陣列,破壞的是f2幀頭的main幀的返回後的執行**位址和棧底。因此只有在f2函式執行完後出棧後才會core。剛好這個例子是f2呼叫了f1後只呼叫了printf,f1幀的棧的面貌沒有被其它的呼叫清理掉,所以嘗試找f1幀的棧頭資訊時剛好可以找到,否則的話找到的會是f2中最後乙個呼叫函式呼叫入棧寫入的$rbp值。
gdb 檢視暫存器的值
info registers info all registers 下面這兩個暫時不知道如何使用 info registers reggroup info registers regname four standard register name pc sp fp ps p x pc x i pc ...
暫存器(通用暫存器)
因為學習使用的是王爽的 組合語言 第3版 因此也只能提到8086cpo的暫存器。對於其他而言,原理都是相通的。對於8086暫存器,有14個暫存器,主要是 ax bx cx dx si di sp bp ip cs ss ds es psw。一 通用暫存器 8086的通用暫存器有ax bx cx dx...
暫存器,標誌暫存器
涉及硬體傳輸資料的,往往包含以下內容 1.資料傳輸引腳 資料放 2.控制引腳 怎麼控制 3.狀態引腳 結果如何 暫存器相當於cpu內部的儲存單元,可能是連續排列,相當於 c語言中的陣列。一 8個通用暫存器 16 bit accumulate axah alr0 count cxch clr1 dat...