那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

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

剛接觸指針的時候,經常會遇到段錯誤。

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

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

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

調試段錯誤的手段很多,對于初學者,我推薦兩個,一個是通過打印的方式定位,一個是使用gdb。 打印方法最簡單。
root@Turbo:linklist# ls
link.c  link.h  main  main.c
root@Turbo:linklist# ./main
鏈表初始化成功
Segmentation fault (core dumped)
root@Turbo:linklist#
比如這里有個鏈表的代碼,代碼量大概300行,從現象可以看出,鏈表的初始化成功,緊接著就出現了段錯誤。 于是我們大概能推測出問題出在了鏈表的插入操作上。
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;
}
找到鏈表的插入操作,可以把它分成幾個功能,入參判斷,移動指針,判斷位置是否合法,申請新節點,修改指針域。

在每個功能前面加上一些打印,隨便打印什么都行。
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#
于是,問題再次被縮小,應該是移動指針的時候出了問題。
//把指針移動到要插入位置的前一個位置
    Node *q = h;
    int k = 1;
    while (k < p)      
    {   
        q = q->next;
        k++;
    }
這幾行代碼,能跟指針扯上關系的,應該就是第 6 行了。當然,這只是發現了段錯誤在哪,具體怎么修改,還得根據你的業務邏輯繼續分析。

通過打印定位問題確實比較慢。如果代碼量比較大,又不能大概判斷出問題所在,可以借助一些工具,常用的比如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行。

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

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

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





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21743
  • GNU
    GNU
    +關注

    關注

    0

    文章

    143

    瀏覽量

    17542
  • GDB調試
    +關注

    關注

    0

    文章

    24

    瀏覽量

    1489

原文標題:調試段錯誤

文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    9B90的網絡LED燈不亮,是何原因?

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

    何原因導致的STM32的重啟

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

    何原因導致的STM32程序仿真重啟

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

    Labview運行myrio沖突拒絕訪問是何原因導致的

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

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

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

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

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

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

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

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

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

    modbus通訊延遲回復導致讀取錯位是何原因?

    modbus通訊延遲回復導致讀取錯位是何原因
    發表于 05-05 16:09

    導致致命異常錯誤和無效頁錯誤原因是什么?

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

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

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

    Linux環境下段錯誤的產生原因及調試方法小結

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

    什么是錯誤?

    。 這個內存區要么是不存在的,要么是受到系統保護的,還有可能是缺少文件或者文件損壞。 二、錯誤產生的原因下面是一些典型的錯誤
    的頭像 發表于 09-11 14:04 ?1.7w次閱讀

    何原因造成芯片產業爛尾潮?

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

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

    電子發燒友網為你提供半橋諧振LLC效率偏低是何原因?資料下載的電子資料下載,更有其他相關的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發表于 04-05 08:45 ?22次下載
    半橋諧振LLC效率偏低是<b class='flag-5'>何原因</b>?資料下載
    屏东县| 网页百家乐的玩法技巧和规则| 免费百家乐官网规则| 百家乐美女视频| 富顺县| 博必发百家乐的玩法技巧和规则| 百家乐官网庄6点| 君豪棋牌是真的吗| 百家乐注册开户送彩金| 百家乐官网最新首存优惠| 百家乐规| 做生意店铺风水好吗| 现金百家乐官网伟易博| 大发888娱乐城外挂| 伟博百家乐官网娱乐城| 易赢百家乐官网软件| 二八杠游戏机| 网上百家乐如何打水| 百家乐官网庄闲和各| 香港六合彩码报| 百家乐下| 百樂坊百家乐官网的玩法技巧和规则 | 大世界百家乐官网娱乐城| 大发888娱乐城 真钱| 澳门百家乐赌场网址| 恒利百家乐官网的玩法技巧和规则 | 娱乐城源码| 聚众玩百家乐的玩法技巧和规则 | 威尼斯人娱乐棋牌| 百家乐出千大全| 百家乐官网平台出租家乐平台出租 | 百家乐官网最好投注| 鸿博,| 百家乐破解秘| 百家乐连开6把小| 菲律宾百家乐官网娱乐平台| 成武县| 赌球者| 百家乐赌博论坛| 做生意门口怎么摆放| 百家乐官网赌场讨论群|