Segmentation fault (core dumped) -llinux系統內存錯誤報錯信息

目錄

  • 1 問題原因
    • (1)內存訪問越界
    • (2)多線程程序使用了線程不安全的函數。
    • (3)多線程讀寫的數據未加鎖保護。
    • (5)堆棧溢出。
  • 2 使用GDB查看core文件
  • 3 使用GDB調試程序

返回目錄

1 問題原因

Segmentation fault (core dumped)多為內存不當操作造成。空指針、野指針的讀寫操作,數組越界訪問,破壞常量等。對每個指針聲明后進行初始化為NULL是避免這個問題的好辦法。排除此問題的最好辦法則是調試。

更為詳細的原因:

返回目錄

(1)內存訪問越界

a) 由于使用錯誤的下標,導致數組訪問越界
b) 搜索字符串時,依靠字符串結束符來判斷字符串是否結束,但是字符串沒有正常的使用結束符
c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函數,將目標字符串讀/寫爆。應該使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函數防止讀寫越界。

返回目錄

(2)多線程程序使用了線程不安全的函數。

返回目錄

(3)多線程讀寫的數據未加鎖保護。

對于會被多個線程同時訪問的全局數據,應該注意加鎖保護,否則很容易造成core dump

(4)非法指針a) 使用空指針
b) 隨意使用指針轉換。一個指向一段內存的指針,除非確定這段內存原先就分配為某種結構或類型,或者這種結構或類型的數組,否則不要將它轉換為這種結構或類型的指針,而應該將這段內存拷貝到一個這種結構或類型中,再訪問這個結構或類型。這是因為如果這段內存的開始地址不是按照這種結構或類型對齊的,那么訪問它時就很容易因為bus error而core dump.

返回目錄

(5)堆棧溢出。

不要使用大的局部變量(因為局部變量都分配在棧上),這樣容易造成堆棧溢出,破壞系統的棧和堆結構,導致出現莫名其妙的錯誤。

返回目錄

2 使用GDB查看core文件

默認編譯出來的程序在出現Segmentation fault 時并沒有生成core崩潰文件,可以在gcc/g++編譯時增加-g選項。

如果仍然沒有生成core文件,則可能是因為系統設置了core文件大小為0,可以通過:ulimit -a 查詢得知。

執行 ulimit -c unlimited 命令后可以使core文件大小不受限制。此時再次運行程序應該就能在同級目錄看到core.XXX文件了

使用 gdb ./a.out core.XXX 可以查看出錯所在行信息,這樣就進入了 gdb core 調試模式。

追蹤產生segmenttation fault的位置及代碼函數調用情況:

gdb>bt

這樣,一般就可以看到出錯的代碼是哪一句了,還可以打印出相應變量的數值,進行進一步分析。

返回目錄

3 使用GDB調試程序

如上述流程不能解決問題,下面可使用gdb單步調試程序。重新編譯程序,編譯命令中加入-g。如:

gcc -lm -O3 -g file.c -o file
之后使用gdb命令

gdb file
開始調試。

輸入start使程序運行到main中第一行運行代碼。next或者n為執行下一行程序,until xx執行到xx行,print或p可輸出變量值,b xx用于在xx行設置斷點,run或r用于執行程序至下一斷點,d xx刪除xx行斷點。

我們可以先run一遍程序,這時它會提示出錯行信息。然后until到出錯行前5行,交替執行next和print,輸出與出錯行變量相關變量或指針的值。最終定位出錯的根本操作在哪一行。修改之即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256912.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256912.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256912.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android 抽屜布局

目前部分APP使用一種類似抽屜式的布局,像QQ那種,感覺很炫,自己也一直想做一個像那樣的布局,(ps網上很多這樣的例子,我下面做的就是參考網上的改變的) 廢話不就不說了,直接上代碼 1、…

學習筆記(35):Python網絡編程并發編程-協程(yield,greenlet,gevent模塊)

立即學習:https://edu.csdn.net/course/play/24458/296457?utm_sourceblogtoedu 協程(yield,greenlet,gevent) 1.協程:在單線程中通過不斷地在多個任務之間進行切換執行,來達到并發的效果的線程,可以提高效率 2.yiel…

雙目標定算法

坐標系基礎知識: > 1.1. 從像素坐標系(u,v) 到 世界坐標系(Xw,Yw,Yw) 這里直接拿上篇博文的結果,中間省去了其它坐標系直接的關系,直接給出,如下所示: 公式如下: > 1.2. 符號規定( Notation ) 為了…

Spring bean三種創建方式

spring共提供了三種實例化bean的方式:構造器實例化(全類名,反射)、工廠方法(靜態工廠實例化 動態工廠實例化)和FactoryBean ,下面一一詳解: 1、構造器實例化 City.java 1 package com.proc.bean;2 3 publ…

Excel使用控件創建動態地圖圖表

[本文軟件Excel 2010] 效果圖: 首先我們看一下數據源 數據源中第二列是對應圖形的名稱。首先創建圖形,我們可能在網絡中找到各個地圖的矢量圖形。不過不是每個地圖圖形都適合我們,或許企業劃分非按照行政區劃分。因此可以嘗試自己繪制&#x…

Windows 10 常用的快捷鍵及常用指令

系統快捷鍵 快捷鍵功能說明備注CtrlShiftEsc打開任務管理器macbook: fnshiftF11普通鍵盤: PrintScreen截屏幕圖macbook: fnshiftoptionF11普通鍵盤: altPrintScreen截取當前窗口圖片macbook: WinfnEsc普通鍵盤: WinPause/Break打開系統屬性WinctrlD新建虛擬桌面Windows 10Winct…

學習筆記(35續):Python網絡編程并發編程-基于gevent及線程池實現的并發套接字通訊

1.基于線程池實現并發套接字通訊:因為套接字涉及地是I/O密集模型,因此使用多線程會有高效率 服務器 #基于線程池完成并發的套接字通訊 from socket import * from threading import Thread from concurrent.futures import ThreadPoolExecutordef commun…

使用Configuration Manager部署及管理軟件更新(2)

承接上一篇文章:http://ericxuting.blog.51cto.com/8995534/1543835 一、 確定軟件更新符合性 1. 打開Configuration Manager管理控制臺,點擊軟件庫,展開軟件更新,點擊所有軟件更新 2. 點擊主頁中的運行摘要,等待對話框…

NULL、nil、Nil、NSNull的區別

標志值含義NULL(void *)0C指針的字面零值nil(id)0Objecve-C對象的字面零值Nil(Class)0Objecve-C類的字面零值NSNull[NSNull null]用來表示零值的單獨的對象轉載于:https://www.cnblogs.com/wlsxmhz/p/56250…

Fiddler 域名過濾

原來一直沒意識到Fiddler過濾,導致每次抓包都要自己判斷、搜索好多東西,真是呵呵! 過濾設置很簡單,看懂一張圖就解決問題了。 箭頭 那兩處設置下,圓圈處保存再進行抓包即可 轉載于:https://www.cnblogs.com/eejron/p/4…

windows中VS卸載opencv配置,重新安裝其他版本

1、找到工程的屬性管理器,電機Debug64和Release64下面的 包含目錄和庫目錄,刪掉其原由配置的oepncv路徑; 找到鏈接器中的附加依賴項,刪掉原有的配置;

學習筆記(36):Python網絡編程并發編程-IO模型介紹

立即學習:https://edu.csdn.net/course/play/24458/296460?utm_sourceblogtoedu I/O模型介紹:I/O模型表示處于等待狀態的模型,如套接字通訊的accept和recv函數一樣 1.同步I/O 2.異步I/O 3.阻塞I/O 4.非阻塞I/O

AD9 如何畫4層pcb板

新建的PCB文件默認的是2層板,教你怎么設置4層甚至更多層板。在工具欄點擊Design-->Layer Stack Manager.進入之后顯示的是兩層板,添加為4層板,一般是先點top layer, 再點Add Layer,再點Add Layer,這樣就成了4層板。見下圖。 有…

gulp 流處理

包含的內容: 穿插流流合并流隊列流篩選1. 穿插流// passthrough stream 把流傳遞給其他的// usegulp.src(glob,{passthrough:true})// function 進行流的合并處理,避免多余配置以及冗余代碼 2. 合并流// 使用merge2// install yarn add merge2 or …

windows上使用cmake 編譯yaml-cpp源碼,生成yam-cpp.lib

1、打開cmake-gui 2、添加CmakeList 3、建立build 4、進入工程中生成debug和release版本的lib

BZOJ 3039: 玉蟾宮( 懸線法 )

最大子矩陣...懸線法..時間復雜度O(nm)懸線法就是記錄一個H向上延伸的最大長度(懸線), L, R向左向右延伸的最大長度, 然后通過遞推來得到. ------------------------------------------------------------------#include<bits/stdc.h>using namespace std;#define ok(c) …

學習筆記(37):Python實戰編程-yield實現生成器

立即學習:https://edu.csdn.net/course/play/19711/255579?utm_sourceblogtoedu1.yield return generator yield是一個返回的是一個生成器對象&#xff0c;是通過next函數一次一次地進行函數地迭代來獲取結果的&#xff0c;而return函數則是將結果返回后&#xff0c;不再與…

ie6、7 下input的邊框問題 ?

input的border設置為none,ie8及以上border都兼容&#xff0c;ie6和7的border還繼續存在&#xff0c;將border設為0時所有瀏覽器上都不存在了&#xff0c;但是border為0時還是會繼續的渲染。 將input的border設為"0 none",ie7及以上都正常了&#xff0c;但是ie6上inpu…

Mocha BSM產品亮點——關聯事件分析

業務需求與挑戰企業經常會遇到下列場景&#xff1a;? 企業某應用&#xff0c;例如&#xff0c;WebSphere Portal Server&#xff0c;已經不可用&#xff0c;是由于應用自身已不可用&#xff1f;還是應用所連接的數據庫出了問題&#xff1f;還是應用的LDAP服務不可用&#xff1…

輕量級文本編輯器,Notepad最佳替代品:Notepad++

目錄 正文之前1. 目的2. 原帖3. 為何推薦Notepad3.1. Notepad的一些基本特點3.2. notepad&#xff0c;notepad2&#xff0c;notepad&#xff0c;ultraEdit比較4. 使用Notepad前要了解的知識4.1. Notepad的名稱和縮寫4.2. Notepad修改設置后&#xff0c;立即生效4.3. Notepad的版…