C++段錯(cuò)誤(Segmentation fault)快速定位的解決方法
問題背景
寫過C++的朋友都知道,有時(shí)候程序編譯通過,并不能代表程序就是對(duì)的。在linux下做開發(fā)時(shí),經(jīng)常會(huì)遇到跑崩潰的情況,但是在終端只會(huì)報(bào)Segmentation fault,這種情況大部分原因都是諸如訪問越界,指針非法操作等等問題,如果工程代碼量少,你還能重新debug一下慢慢找,但是對(duì)于大型工程,想短時(shí)間內(nèi)找到是很難的。
問題解決
實(shí)際上,程序運(yùn)行崩潰或中止時(shí),會(huì)在當(dāng)前目錄下生成一種core文件,記錄了異常時(shí)的運(yùn)行狀態(tài)等信息,通過gdb調(diào)用這個(gè)core文件就可以快速定位到錯(cuò)誤。這里舉例說明:
假如我寫了個(gè)源程序如下:
// hello.cpp #include <iostream> #include <unistd.h> int main() { while(1) { char *p = new char(); delete p; p = nullptr; *p = '2'; sleep(1); } return 0; }
指針p new完后又delete掉了,此時(shí)p已經(jīng)為空,如果此時(shí)再執(zhí)行*p = '2'; 就會(huì)出問題,但是編譯器不知道,因?yàn)榇a的類型檢查都通過了。
# 編譯通過 g++ -g hello.cpp -o hello # 當(dāng)前目錄下有兩個(gè)文件 ls test.cpp test
我們通過./test執(zhí)行程序,就會(huì)出現(xiàn)如下圖的錯(cuò)誤。
但是此時(shí)并不會(huì)生成core文件,需要通過命令開啟core文件的生成:
ulimit -c 0 # -c后面的參數(shù)實(shí)際就是限制core文件的大小,設(shè)置為0表示不允許生成core ulimit -c 100
然后重新執(zhí)行./test,報(bào)錯(cuò)誤后就會(huì)發(fā)現(xiàn)當(dāng)前目錄下多了core文件。此時(shí)使用gdb調(diào)試就可以復(fù)現(xiàn)定位問題了:
gdb -c core test
在這里就可以通過調(diào)用棧等信息快速定位問題。
到此這篇關(guān)于C++段錯(cuò)誤(Segmentation fault)快速定位的解決方法的文章就介紹到這了,更多相關(guān)C++段錯(cuò)誤快速定位內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C語言結(jié)構(gòu)體,枚舉,聯(lián)合體的使用
這篇文章主要給大家介紹一下關(guān)于C語言中結(jié)構(gòu)體、枚舉、聯(lián)合體的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考一下2022-07-07C++ 中重載和運(yùn)算符重載加號(hào)實(shí)現(xiàn)矩陣相加實(shí)例代碼
這篇文章主要介紹了C++ 中重載和運(yùn)算符重載加號(hào)實(shí)現(xiàn)矩陣相加實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03帶你用C語言實(shí)現(xiàn)strtok和字符串分割函數(shù)
下面小編就為大家?guī)硪黄猚語言中字符串分割函數(shù)及實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2021-09-09