0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

段錯誤是什么意思?是何原因引起的?

學(xué)益得智能硬件 ? 來源:學(xué)益得智能硬件 ? 2023-02-13 09:41 ? 次閱讀

剛接觸指針的時候,經(jīng)常會遇到段錯誤。

root@Turbo:linklist# ls
link.c  link.h  main  main.c
root@Turbo:linklist# ./main
鏈表初始化成功
Segmentation fault (core dumped)
root@Turbo:linklist#
所謂段錯誤,就是訪問了不能訪問的內(nèi)存。

83c8554a-ab3d-11ed-bfe3-dac502259ad0.png

比如內(nèi)存不存在,或者受保護等等。 遇到段錯誤,就得去調(diào)試,不管是通過什么手段,一定得先找到哪行代碼出現(xiàn)了段錯誤,然后才能分析修改。

調(diào)試段錯誤的手段很多,對于初學(xué)者,我推薦兩個,一個是通過打印的方式定位,一個是使用gdb。 打印方法最簡單。
root@Turbo:linklist# ls
link.c  link.h  main  main.c
root@Turbo:linklist# ./main
鏈表初始化成功
Segmentation fault (core dumped)
root@Turbo:linklist#
比如這里有個鏈表的代碼,代碼量大概300行,從現(xiàn)象可以看出,鏈表的初始化成功,緊接著就出現(xiàn)了段錯誤。 于是我們大概能推測出問題出在了鏈表的插入操作上。
int insert_link(Node *h, int p, int n)
{
    if (NULL == h)
    {
        return FAILURE;
    }


    //把指針移動到要插入位置的前一個位置
    Node *q = h;
    int k = 1;
    while (k < p)      //q != NULL  防止位置p太大
    {
        q = q->next;
        k++;
    }


    //判斷位置是否合法
    if (q == NULL || k > p)    //位置太大  位置太小
    {
        return FAILURE;
    }


    Node *m = (Node *)malloc(sizeof(Node) * 1);
    if (NULL == m)
    {
        return FAILURE;
    }


    m->data = n;
    m->next = q->next;
    q->next = m;


    return SUCCESS;
}
找到鏈表的插入操作,可以把它分成幾個功能,入?yún)⑴袛?,移動指針,判斷位置是否合法,申請新?jié)點,修改指針域。

在每個功能前面加上一些打印,隨便打印什么都行。
int insert_link(Node *h, int p, int n)
{
    //printf("1111
");
    if (NULL == h)
    {
        return FAILURE;
    }


    //printf("2222
");
    //把指針移動到要插入位置的前一個位置
    Node *q = h;
    int k = 1;
    while (k < p)      //q != NULL  防止位置p太大
    {
        q = q->next;
        k++;
    }


    printf("3333
");
    //判斷位置是否合法
    if (q == NULL || k > p)    //位置太大  位置太小
    {
        return FAILURE;
    }


    printf("4444
");
    Node *m = (Node *)malloc(sizeof(Node) * 1);
    if (NULL == m)
    {
        return FAILURE;
    }
    printf("5555
");
    m->data = n;
    m->next = q->next;
    q->next = m;


    return SUCCESS;
}
再次運行,程序輸出了1和2。
root@Turbo:linklist# gcc main.c link.c -o main
root@Turbo:linklist# ./main
鏈表初始化成功
1111
2222
Segmentation fault (core dumped)
root@Turbo:linklist#
于是,問題再次被縮小,應(yīng)該是移動指針的時候出了問題。
//把指針移動到要插入位置的前一個位置
    Node *q = h;
    int k = 1;
    while (k < p)      
    {   
        q = q->next;
        k++;
    }
這幾行代碼,能跟指針扯上關(guān)系的,應(yīng)該就是第 6 行了。當然,這只是發(fā)現(xiàn)了段錯誤在哪,具體怎么修改,還得根據(jù)你的業(yè)務(wù)邏輯繼續(xù)分析。

通過打印定位問題確實比較慢。如果代碼量比較大,又不能大概判斷出問題所在,可以借助一些工具,常用的比如GDB
root@Turbo:linklist# gcc main.c link.c -o main -g
root@Turbo:linklist# gdb main
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
    .


For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from main...
(gdb) run
Starting program: /root/test/linklist/main 
鏈表初始化成功
1111
2222


Program received signal SIGSEGV, Segmentation fault.
0x0000555555555783 in insert_link (h=0x5555555592a0, p=5, n=9) at link.c:42
42      q = q->next;
(gdb)
編譯的時候加上-g選項,直接使用gdb加上文件名,run啟動程序,一眼就能看出錯誤在第42行。

當然了,這個程序是我故意寫的段錯誤,有些段錯誤發(fā)生在庫里面,并不能很直觀的看出來在哪一行。這就需要借助斷點、單步調(diào)試等等操作。

類似GDB的調(diào)試工具還有很多,如果是初學(xué)者,沒必要掌握太多,能解決問題就行。

845e298a-ab3d-11ed-bfe3-dac502259ad0.png ?





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    315

    瀏覽量

    21557
  • GNU
    GNU
    +關(guān)注

    關(guān)注

    0

    文章

    142

    瀏覽量

    17404
  • GDB調(diào)試
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    1423

原文標題:調(diào)試段錯誤

文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    9B90的網(wǎng)絡(luò)LED燈不亮,是何原因?

    8M 外部晶體,UART0 完全正常,UART1 工作出錯,送出的數(shù)據(jù)完全不對。UART0 的代碼是UART1 的代碼拷貝過去修改的。請教可能的原因?另:9B90 的網(wǎng)絡(luò)LED燈不亮,是何原因?
    發(fā)表于 08-20 06:21

    何原因導(dǎo)致的STM32的重啟

    可以定位是硬件問題了,但是我左看右看也看不出硬件哪里出了問題;本來想放棄,想想這個問題不搞明白,后患無窮;采用的是仿真的手段,看看是何原因導(dǎo)致的重啟:程序中加入對RCC_CSR寄存器清零的代碼,以便在程序...
    發(fā)表于 08-02 08:54

    何原因導(dǎo)致的STM32程序仿真重啟

    何原因導(dǎo)致的STM32程序仿真重啟?怎樣去解決這個問題?
    發(fā)表于 09-24 06:27

    Labview運行myrio沖突拒絕訪問是何原因導(dǎo)致的

    Labview運行myrio沖突拒絕訪問是何原因導(dǎo)致的?怎樣去解決Labview運行myrio沖突拒絕訪問的問題呢?
    發(fā)表于 02-23 06:52

    請教大神樹莓派pico項目創(chuàng)建后,rtthread文件夾沒有文件是何原因?

    請教大神樹莓派pico項目創(chuàng)建后,rtthread文件夾沒有文件是何原因?
    發(fā)表于 09-28 09:56

    Firefly-RK3288攝像頭模組打開發(fā)生錯誤何原因

    我使用的是OV8858攝像頭模組,無論是使用自帶的照相機應(yīng)用還是從網(wǎng)上下載的360攝像機應(yīng)用,第一次打開攝像頭均使用正常,關(guān)閉后第二次再打開,就顯示攝像頭發(fā)生錯誤,是何原因?
    發(fā)表于 10-08 16:12

    為什么我不能下載spc5studio呢?是何原因?

    為什么我不能下載spc5studio?是何原因?
    發(fā)表于 01-17 06:18

    proteus中cpu負載過大無法仿真是何原因?怎么解決?

    proteus中cpu負載過大無法仿真是何原因?怎么解決?
    發(fā)表于 04-23 16:40

    modbus通訊延遲回復(fù)導(dǎo)致讀取錯位是何原因?

    modbus通訊延遲回復(fù)導(dǎo)致讀取錯位是何原因?
    發(fā)表于 05-05 16:09

    導(dǎo)致致命異常錯誤和無效頁錯誤原因是什么?

    導(dǎo)致致命異常錯誤和無效頁錯誤原因是什么? 如果Microsoft Word或Excel“崩潰”,意味著在程序執(zhí)行過程中出現(xiàn)了嚴重的錯誤。操作系統(tǒng)常常會發(fā)現(xiàn)存在一個嚴重問題,并
    發(fā)表于 08-05 10:33 ?993次閱讀

    硬件設(shè)計中的30個錯誤想法和原因分析

    硬件設(shè)計中的30個錯誤想法和原因分析
    發(fā)表于 12-15 18:25 ?97次下載

    Linux環(huán)境下段錯誤的產(chǎn)生原因及調(diào)試方法小結(jié)

    dmesg可以在應(yīng)用程序crash掉時,顯示內(nèi)核中保存的相關(guān)信息。如下所示,通過dmesg命令可以查看發(fā)生錯誤的程序名稱、引起錯誤發(fā)生的內(nèi)存地址、指令指針地址、堆棧指針地址、
    的頭像 發(fā)表于 04-30 15:23 ?2394次閱讀

    什么是錯誤?

    。 這個內(nèi)存區(qū)要么是不存在的,要么是受到系統(tǒng)保護的,還有可能是缺少文件或者文件損壞。 二、錯誤產(chǎn)生的原因下面是一些典型的錯誤
    的頭像 發(fā)表于 09-11 14:04 ?1.6w次閱讀

    何原因造成芯片產(chǎn)業(yè)爛尾潮?

    在短短一年多時間里,分布于我國江蘇、四川、湖北、貴州、陜西等5省的6個百億級半導(dǎo)體大項目先后停擺。業(yè)界擔憂,造芯熱引發(fā)爛尾潮,造成國有資產(chǎn)損失,延誤芯片產(chǎn)業(yè)發(fā)展大好機遇。那么問題來了,是何原因造成上述爛尾潮?中國芯崛起之路又當如何前行?
    的頭像 發(fā)表于 11-03 09:12 ?1.3w次閱讀

    半橋諧振LLC效率偏低是何原因?資料下載

    電子發(fā)燒友網(wǎng)為你提供半橋諧振LLC效率偏低是何原因?資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-05 08:45 ?22次下載
    半橋諧振LLC效率偏低是<b class='flag-5'>何原因</b>?資料下載