1. 程式人生 > 其它 >gdb除錯core檔案快速定位core dump位置

gdb除錯core檔案快速定位core dump位置

core dump又叫核心轉儲, 當程式執行過程中發生異常, 程式異常退出時, 由作業系統把程式當前的記憶體狀況儲存在一個core檔案中, 叫core dump. (linux中如果記憶體越界會收到SIGSEGV訊號,然後就會core dump)

在程式執行的過程中,有的時候我們會遇到Segment fault(段錯誤)這樣的錯誤。這種看起來比較困難,因為沒有任何的棧、trace資訊輸出。該種類型的錯誤往往與指標操作相關。往往可以通過這樣的方式進行定位。

一、造成segment fault,產生core dump的可能原因

1、記憶體訪問越界

a) 由於使用錯誤的下標,導致陣列訪問越界

b) 搜尋字串時,依靠字串結束符來判斷字串是否結束,但是字串沒有正常的使用結束符

c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字串操作函式,將目標字串讀/寫爆。應該使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函式防止讀寫越界。

2、多執行緒程式使用了執行緒不安全的函式。

3、多執行緒讀寫的資料未加鎖保護。對於會被多個執行緒同時訪問的全域性資料,應該注意加鎖保護,否則很容易造成core dump

4、非法指標

a) 使用空指標

b) 隨意使用指標轉換。一個指向一段記憶體的指標,除非確定這段記憶體原先就分配為某種結構或型別,或者這種結構或型別的陣列,否則不要將它轉換為這種結構或型別的指標,而應該將這段記憶體拷貝到一個這種結構或型別中,再訪問這個結構或型別。這是因為如果這段記憶體的開始地址不是按照這種結構或型別對齊的,那麼訪問它時就很容易因為bus error而core dump.

5、堆疊溢位.不要使用大的區域性變數(因為區域性變數都分配在棧上),這樣容易造成堆疊溢位,破壞系統的棧和堆結構,導致出現莫名其妙的錯誤。

二、配置作業系統使其產生core檔案

首先通過ulimit命令檢視一下系統是否配置支援了dump core的功能。通過ulimit -c或ulimit -a,可以檢視core file大小的配置情況,如果為0,則表示系統關閉了dump core。可以通過ulimit -c unlimited來開啟。若發生了段錯誤,但沒有core dump,是由於系統禁止core檔案的生成。

解決方法:
$**ulimit -c unlimited**  (只對當前shell程序有效)
或在~/.bashrc

 的最後加入:* ulimit -c unlimited*(一勞永逸)

檢視系統是否禁止core檔案生成:

# ulimit -c

0

$ ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

file size (blocks, -f) unlimited

三、用gdb檢視core檔案

發生core dump之後, 用gdb進行檢視core檔案的內容, 以定位檔案中引發core dump的行.

gdb [exec file] [ core file]

如: gdb ./test test.core

四、使用core檔案定位core dump位置

先使用命令 gdb [exec file] [ core file]檢視core檔案,然後輸入where命令,gdb就會輸出coredump的位置。

五、樣例

1、test.c的原始碼

 1 void do_it();
 2 
 3 int main()
 4 
 5 {
 6 
 7   do_it();
 8 
 9   return 0;
10 
11 }
12 
13 void do_it()
14 
15 {
16 
17   char *p = 1;
18 
19   *p = 'a';
20 
21 }

2、編譯該原始碼

1 gcc -g test.c

3、解除系統core檔案限制

1 ulimit -c unlimited

4、執行程式,自動生成core檔案

1 ./a.out

5、gdb除錯core檔案

1 gdb ./a.out ./core

6、檢視coredump的位置

1 gdb下輸入where

轉自:https://blog.csdn.net/dyzhen/article/details/83823605