通過GDB快速定位「段錯誤」的位置

2021-08-19 09:37:37 字數 1682 閱讀 4713

有些時候我們在一段 c/c++ **的時候,由於對乙個非法記憶體進行了操作,在程式執行的過程中,出現了「segmentation fault (core dumped)」——段錯誤。

呵呵,這種問題我想很多人會經常遇到。遇到這種問題是非常無語的,只是提示了"段錯誤",接著什麼都沒有,如果我們一味的去看**找太疼苦了,因為我們都相信自己寫的**沒問題,現實就是現實。接著,我們可能通過列印來定位到段錯誤的位置,這樣會有個問題,如果**量大,我們需要列印很多資訊才能找到「段錯誤」的位置(這種辦法實在太笨了),而往往有些時候,「段錯誤」光靠列印不一定能找出來。接下來,給大家介紹通過gdb快速定位「段錯誤」的位置

gdb是gnu開源組織發布的乙個強大的unix下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像vc、bcb等ide的除錯,但如果你是在unix平台下做軟體,你會發現gdb

這個除錯工具有比vc、bcb的圖形化偵錯程式更強大的功能。所謂「寸有所長,尺有所短」就是這個道理。

首先,要確保安裝了gdb除錯工具,在終端可通過「which gdb」檢視:

編譯 c/c++ **,加上-g

引數,代表在可執行檔案中加入標準除錯資訊。

接著,通過「./」執行可執行程式,如果出現「段錯誤」,正常情況下會在程式同級目錄下生成乙個core檔案(如redhat

),但是,有些環境卻不會生成core檔案(如ubuntu

),core檔案的生成跟你當前系統的環境設定有關係。當乙個程式奔潰時,在程序當前工作目錄的core檔案中複製了該程序的儲存影象。core檔案僅僅是乙個記憶體映像(同時加上除錯資訊),主要用來除錯的。

在ubuntu 14.04(64位)環境下測試:

c測試**如下:

#include

#include

void test()

int main(int argc, char*argv)  

1)編譯(加上-g)、執行程式,發現同級目錄並沒有生產core

檔案:2)core檔案的生成跟你當前系統的環境設定有關係,可以用下面的語句設定讓其生成core檔案:ulimit -cunlimited。core 檔案生成的位置一般於執行程式的路徑相同,在ubuntu下檔名一般為core。

3)用gdb來除錯core檔案:gdb a.out core

4)在gdb字元介面中敲「where」檢視更詳細資訊。

多執行緒中快速定位段錯誤位置

在做嵌入式linux開發的時候,程式很容易出現段錯誤。段錯誤一般是記憶體操作指標出錯或是記憶體溢位等問題,有的時候系統會有一點錯誤提示,但有的時候就直接提示個segmentation fault core dumped 如果程式是單執行緒,那很好處理,編譯的時候新增引數 g 直接使用gdb 單步除錯...

定位段錯誤所在位置

執行緒建立需要使用prctl函式來指明執行緒名字,此名字將會在段錯誤時顯示出來 沒有了,好像 proc task yyy status 程序號,yyy 執行緒號,task 執行緒目錄,status 狀態檔案 status 檔案下有sigblk標誌,當然也有其它的,但這個作用於段錯誤說明。sigblk...

Linux中快速定位段錯誤的方法

在做嵌入式linux開發的時候,程式很容易出現段錯誤。段錯誤一般是記憶體操作指標出錯或是記憶體溢位等問題,有的時候系統會有一點錯誤提示,但有的時候就直接提示個segmentation fault core dumped 如果程式是單執行緒,那很好處理,編譯的時候新增引數 g 直接使用gdb 單步除錯...