最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++段錯(cuò)誤(Segmentation fault)快速定位的解決方法

 更新時(shí)間:2024年07月05日 09:34:08   作者:昰綻至強(qiáng)  
寫過C++的朋友都知道,有時(shí)候程序編譯通過,并不能代表程序就是對的,在linux下做開發(fā)時(shí),經(jīng)常會(huì)遇到跑崩潰的情況,但是在終端只會(huì)報(bào)Segmentation fault,如果工程代碼量少,你還能重新debug一下慢慢找,本文給大家介紹了C++段錯(cuò)誤的快速定位,需要的朋友可以參考下

問題背景

寫過C++的朋友都知道,有時(shí)候程序編譯通過,并不能代表程序就是對的。在linux下做開發(fā)時(shí),經(jīng)常會(huì)遇到跑崩潰的情況,但是在終端只會(huì)報(bào)Segmentation fault,這種情況大部分原因都是諸如訪問越界,指針非法操作等等問題,如果工程代碼量少,你還能重新debug一下慢慢找,但是對于大型工程,想短時(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

平远县| 吴川市| 浦城县| 房产| 长治县| 六枝特区| 阿鲁科尔沁旗| 林周县| 开封县| 凤台县| 定日县| 汤阴县| 海宁市| 眉山市| 合山市| 游戏| 曲麻莱县| 陵川县| 连山| 镇安县| 郁南县| 砚山县| 庐江县| 无极县| 库伦旗| 宣恩县| 阿巴嘎旗| 贵州省| 安义县| 大竹县| 玉龙| 宜春市| 南乐县| 攀枝花市| 民勤县| 即墨市| 团风县| 错那县| 五华县| 成安县| 城口县|