【ubuntu】C/C++發生CoreDump(段錯誤,核心轉儲)後,如何快速定位到錯誤之處。

前言

相信很多小夥伴在Linux環境下運行C++代碼時都遇到過“段錯誤”,“核心轉儲”這種讓人摸不着頭腦的錯誤,但是又不知道如何定位到錯誤的位置。往往就放棄解決了,但是在實際工程中,出現這種錯誤是一定要解決的,不然項目拉跨了只能捲鋪蓋走人了。那麼當項目工程量大的時候,我們來說說怎麼快速定位到代碼報錯的位置。

Core dump的類型

1. 內存訪問越界的問題(最典型的比如數組下標越界)
2. 堆棧溢出(使用了過大的局部變量,因爲局部變量存儲在棧中,容易導致溢出;函數遞歸的深度太大等等)
3. 非法指針(比如隨意的強制轉換指針的類型,或者使用了空指針)
4. 多線程同時讀寫某一個變量時,沒有加線程鎖。

假設有一段會core dump的程序:

//file:core_dump_test.cpp
#include<iostream>
using namespace std;
int vis[100];
int core_error(int list[])
{
    int a = list[6450];//訪問越界 
    return a;
}
int main(){
    int tmp = core_error(vis);
    return 0;
}

使用gcc或者g++編譯後,生成了可執行文件core_dump,運行可執行文件會報錯如下:
在這裏插入圖片描述
接下來我們就來說說如何定位錯誤。

第一步:生成core文件(Linux默認不生成,而我們要修改一下系統配置)

1.首先在命令行中輸入

ulimit -a

會出現以下信息:
在這裏插入圖片描述
core_file_size 爲0,則說明當前系統限制了core文件的生成,我們需要在命令行輸入

ulimit -c unlimited

這個操作只是暫時的,重啓電腦後core_file_size就變回0了,避免程序不斷coredump然後生成了一大堆的core文件。這裏可能會出現這個錯誤(如果沒有請跳過):

bash: ulimit: core file size: cannot modify limit: 不允許的操作

這是因爲linux系統對普通用戶有ulimit硬配置的限制。超出硬配置的上限就會不允許操作。但是問題不大,我們可以通過修改/proc/sys/fs下的文件來該硬配置,操作如下:

echo '1000000' > /proc/sys/fs/file-max
echo '1000000' > /proc/sys/fs/nr_open
file-max:系統內核最多可以打開的文件描述符數量
nr_open:某個進程可以打開的文件描述符數量 

現在再次輸入ulimit -c unlimited會出現:
在這裏插入圖片描述
接下來再次運行可執行文件core_dump,將會生成core文件
在這裏插入圖片描述

第二步:使用gdb來定位錯誤

執行命令

gdb  [可執行程序]  core文件
我這裏是 gdb core_dump core

在這裏插入圖片描述
上圖告訴了我們出現錯誤的地方在 core_error函數裏面。輸入where可以顯示出所有的堆棧信息。

gdb還有很多的功能,我自己也在學習過程中,希望分享出來和大家一起學習。創作不易,如果能幫助到你,是我的榮幸。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章