哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

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

學(xué)益得智能硬件 ? 來(lái)源:學(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ò)誤,就是訪問(wèn)了不能訪問(wèn)的內(nèi)存。

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

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

調(diào)試段錯(cuò)誤的手段很多,對(duì)于初學(xué)者,我推薦兩個(gè),一個(gè)是通過(guò)打印的方式定位,一個(gè)是使用gdb。 打印方法最簡(jiǎn)單。
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ò)誤。 于是我們大概能推測(cè)出問(wèn)題出在了鏈表的插入操作上。
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)指針,判斷位置是否合法,申請(qǐ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#
于是,問(wèn)題再次被縮小,應(yīng)該是移動(dòng)指針的時(shí)候出了問(wèn)題。
//把指針移動(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ù)分析。

通過(guò)打印定位問(wèn)題確實(shí)比較慢。如果代碼量比較大,又不能大概判斷出問(wèn)題所在,可以借助一些工具,常用的比如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è)程序是我故意寫(xiě)的段錯(cuò)誤,有些段錯(cuò)誤發(fā)生在庫(kù)里面,并不能很直觀的看出來(lái)在哪一行。這就需要借助斷點(diǎn)、單步調(diào)試等等操作。

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

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





審核編輯:劉清

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

    關(guān)注

    1

    文章

    321

    瀏覽量

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

    關(guān)注

    0

    文章

    144

    瀏覽量

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

    關(guān)注

    0

    文章

    24

    瀏覽量

    1822

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

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

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

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

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

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

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

    請(qǐng)教大神樹(shù)莓派pico項(xiàng)目創(chuàng)建后,rtthread文件夾沒(méi)有文件是何原因?

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

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

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

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

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

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

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

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

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

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

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

    硬件設(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)信息。如下所示,通過(guò)dmesg命令可以查看發(fā)生錯(cuò)誤的程序名稱、引起錯(cuò)誤發(fā)生的內(nèi)存地址、指令指針地址、堆棧指針地址、
    的頭像 發(fā)表于 04-30 15:23 ?3212次閱讀

    什么是錯(cuò)誤?

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

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

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

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

    電子發(fā)燒友網(wǎng)為你提供半橋諧振LLC效率偏低是何原因?資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-05 08:45 ?24次下載
    半橋諧振LLC效率偏低是<b class='flag-5'>何原因</b>?資料下載
    安泽县| 邵阳市| 通渭县| 当涂县| 无棣县| 临湘市| 鄂尔多斯市| 绵竹市| 富顺县| 卫辉市| 嵊州市| 石景山区| 喀什市| 洱源县| 乐陵市| 乌兰察布市| 汪清县| 昭通市| 龙海市| 南投市| 荣成市| 库尔勒市| 平远县| 故城县| 天峨县| 怀仁县| 射洪县| 陵川县| 昭平县| 寿阳县| 南乐县| 志丹县| 淮南市| 万源市| 麻阳| 台前县| 丁青县| 丰台区| 将乐县| 水城县| 忻州市|