在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

段錯(cuò)誤是什么意思?是何原因引起的?

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

剛接觸指針的時(shí)候,經(jīng)常會(huì)遇到段錯(cuò)誤。

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

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

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

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


    //把指針移動(dòng)到要插入位置的前一個(gè)位置
    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;
}
找到鏈表的插入操作,可以把它分成幾個(gè)功能,入?yún)⑴袛?,移?dòng)指針,判斷位置是否合法,申請新節(jié)點(diǎn),修改指針域。

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


    //printf("2222
");
    //把指針移動(dòng)到要插入位置的前一個(gè)位置
    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;
}
再次運(yùn)行,程序輸出了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)該是移動(dòng)指針的時(shí)候出了問題。
//把指針移動(dòng)到要插入位置的前一個(gè)位置
    Node *q = h;
    int k = 1;
    while (k < p)      
    {   
        q = q->next;
        k++;
    }
這幾行代碼,能跟指針扯上關(guān)系的,應(yīng)該就是第 6 行了。當(dāng)然,這只是發(fā)現(xiàn)了段錯(cuò)誤在哪,具體怎么修改,還得根據(jù)你的業(yè)務(wù)邏輯繼續(xù)分析。

通過打印定位問題確實(shí)比較慢。如果代碼量比較大,又不能大概判斷出問題所在,可以借助一些工具,常用的比如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)
編譯的時(shí)候加上-g選項(xiàng),直接使用gdb加上文件名,run啟動(dòng)程序,一眼就能看出錯(cuò)誤在第42行。

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

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

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





審核編輯:劉清

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

    關(guān)注

    1

    文章

    316

    瀏覽量

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

    關(guān)注

    0

    文章

    143

    瀏覽量

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

    關(guān)注

    0

    文章

    24

    瀏覽量

    1490

原文標(biāo)題:調(diào)試段錯(cuò)誤

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    什么是錯(cuò)誤

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

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

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

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

    電子發(fā)燒友網(wǎng)為你提供半橋諧振LLC效率偏低是何原因?資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-05 08:45 ?22次下載
    半橋諧振LLC效率偏低是<b class='flag-5'>何原因</b>?資料下載
    主站蜘蛛池模板: 亚洲一级特黄特黄的大片 | 俺来也俺去啦久久综合网 | 免费一级视频在线播放 | 亚洲小便 | 综合网在线观看 | 天堂资源中文在线 | www.色日本 | 热久久这里只有精品 | 免费可以看黄的视频 s色 | 亚洲电影一区二区 | 在线观看一二三区 | 国产丝袜va丝袜老师 | 色婷婷综合久久久中文字幕 | 在线视频毛片 | 日本精品视频四虎在线观看 | 激情丁香小说 | 日韩夜夜操 | 黄色尤物 | 白嫩美女在线啪视频观看 | 亚洲欧洲一区二区三区在线观看 | 欧美日本视频一区 | 五月天婷五月天综合网在线 | 狠狠色噜噜狠狠狠狠 | 色婷婷综合久久久中文字幕 | 四虎影院网 | 美女视频黄又黄又免费高清 | 奇米影视9999 | 国产成人啪精品午夜在线观看 | 久久国产精品夜色 | 欧美黄色大全 | 色男人的天堂 | 天堂资源在线播放 | 一级毛片视频在线 | 久久久久国产精品免费免费不卡 | 最新国产在线播放 | 久久亚洲视频 | 久久久久久久久久免观看 | 永久免费在线视频 | 色播欧美| 一级特黄特色的免费大片视频 | 性欧美videofree丝袜 |