1. 程式人生 > >造成segment fault,產生core dump的可能原因!

造成segment fault,產生core dump的可能原因!

一 造成segment fault,產生core dump的可能原因

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 堆疊溢位.不要使用大的區域性變數(因為區域性變數都分配在棧上),這樣容易造成堆疊溢位,破壞系統的棧和堆結構,導致出現莫名其妙的錯誤。


    今天除錯程式時遇到了一個問題,當我用GDB除錯程式時出現了Segmentation fault,以前沒有遇到過,最後檢視資料,有點明白了。
    出現了Segmentation fault,基本上的原因是,非法的記憶體訪問。
例如陣列的越界,在迴圈操作時迴圈變數的控制問題,也有字串拷貝時長度溢位,指標指向了非法的空間,還有就是申明一個指標,但卻沒有對其初始化,就直接引用,或者沒有開闢記憶體空間就釋放記憶體,所以要檢查申請空間時間偶成功。。。
還有那個問題在除錯時會有這樣的資訊:

Program terminated with signal SIGSEGV, Segmentation fault.
對於SIGSEGV這個訊號,經常會和SIGBUS訊號出現在一塊,
SIGBUS與SIGSEGV訊號的一般區別如下:

1) SIGBUS(Bus error)意味著指標所對應的地址是有效地址,但匯流排不能正常使用該指標。
通常是未對齊的資料訪問所致。
2) SIGSEGV(Segment fault)意味著指標所對應的地址是無效地址,沒有實體記憶體對應該地址。
通常導致段錯誤的幾個直接原因:1、解除引用一個包含非法值的指標。2、解除引用一個空指標(常常由於從系統程式中返回空指標,並未經檢查就使用)。
3、在未得到正確的許可權時進行訪問。4、用完了堆疊或堆空間(虛擬記憶體雖然巨大,但絕非無限)。

相關推薦

造成segment fault產生core dump可能原因!

一 造成segment fault,產生core dump的可能原因1.記憶體訪問越界 a) 由於使用錯誤的下標,導致陣列訪問越界 b) 搜尋字串時,依靠字串結束符來判斷字串是否結束,但是字串沒有正常的使用結束符 c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp

造成segment fault產生core dump可能原因

1.記憶體訪問越界  a) 由於使用錯誤的下標,導致陣列訪問越界  b) 搜尋字串時,依靠字串結束符來判斷字串是否結束,但是字串沒有正常的使用結束符  c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字串操作函

【Z】段錯誤Segment Fault定位core dump文件與gdb定位

rect fun 發生 toolbar ulimit top wid title 沒有 使用C++開發系統有時會出現段錯誤,即Segment Fault。此類錯誤程序直接崩潰,通常沒有任何有用信息輸出,很難定位bug,因而無從解決問題。今天我們介紹core dump文件,

GCC如何產生core dump

先決條件 1.安裝apport(automatically generate crash reports for debugging) 2.修改/etc/security/limits.conf檔案,使允許core dump,或者用ulimit -c unlimited設定

segment fault 段錯誤 (core dumped)的起因分析!

核心使用記憶體描述符結構體表示程序的地址空間,該結構體包含了和程序地址空間有關的全部資訊。記憶體描述符由mm_struct結構體表示,定義在檔案<linux/sched.h>中。進程地址空間由每個程序的線性地址區(vm_area_struct)組成。通過核心,程序可以給自己的地址空間動態的新增或

註解方式定義的spring component打jar後掃描失敗的可能原因

       情況是這樣的:web工程採用了ssh框架,dao和service都是通過annotation方式注入的,工程執行正常。後來把service和dao打成jar放在工程的lib目錄下,問題來了,配置沒改動,結果就是不能自動注入dao和service。但是如果把da

Linux下如何生成core dump 文件(解決segment fault段錯誤的問題)

http alt 系統設置 images mit 只讀 功能 lin 設置 Linux下的C程序常常會因為內存訪問等原因造成segment fault(段錯誤),如果此時core dump 的功能是打開的,在運行我們的可執行程序時就會生成一個名為core的文件,然後我們就可

今天不順暢啊 連續寫了兩個core, 我擦!------ /var/log/messages中會有segment fault提示!

        早上接到一個新需求, 開搞。         下午了, 還在塞程式碼, 塞著塞著, 搞出一個core, 該打的log沒有打出來。當時猜測是core了(因為程序號變了), 但沒有core檔案產生, 於是在root下看/var/log/messages資訊, 果

GDB除錯core檔案樣例(如何定位Segment fault

core dump又叫核心轉儲, 當程式執行過程中發生異常, 程式異常退出時, 由作業系統把程式當前的記憶體狀況儲存在一個core檔案中, 叫core dump. (linux中如果記憶體越界會收到SIGSEGV訊號,然後就會core dump)在程式執行的過程中,有的時候我們會遇到Segment fault

關於Release下沒有問題Debug下出現Segment Fault

前言:   在專案開發中出現Release下跑程式沒有問題,Debug下出現Segment Fault。   程式碼如下: void fun(int lines){ int* pA;   if(pA==nullptr){   pA=new int[lines];   } m

SQL Server 更新統計資訊出現嚴重錯誤應放棄任何可能產生的結果

This issue occurs because the database engine is trying to load dangling statistics. When P2P conflict detection is enabled, an MDColumnIdP2pCdId system co

Linux 下如何產生core檔案(core dump設定)

       今天在Linux下除錯C程式時,出現段錯誤,習慣性的ls下當前目錄,發現沒有生成core檔案。驚訝了一下,怎麼回事?以前都會產生的啊,難不成是程式的問題?後來同事提醒是不是系統沒有開啟生成core dump的設定。 還真是系統設定問題,我的ubuntu14.0

[轉]【已解決】Linux下出現Segmentation Faultcore dump)錯誤

最近在Linux環境下做C語言專案,由於是在一個原有專案基礎之上進行二次開發,而且專案工程龐大複雜,出現了不少問題,其中遇到最多、花費時間最長的問題就是著名的“段錯誤”(Segmentation Fault)。藉此機會系統學習了一下,這裡對Linux環境下的

編寫的windows程式崩潰時產生crash dump檔案的辦法

一、引言 dump檔案是C++程式發生異常時,儲存當時程式執行狀態的檔案,是除錯異常程式重要的方法,所以程式崩潰時,除了日誌檔案,dump檔案便成了我們查詢錯誤的最後一根救命的稻草。windows程式產生dump檔案和linux程式產生dump檔案的方式不一樣,linux預

C++中Segmentation fault(Core Dump)錯誤處理

什麼是Core Dump? Core的意思是記憶體, Dump的意思是扔出來, 堆出來. 開發和使用Unix程式時, 有時程式莫名其妙的down了, 卻沒有任何的提示(有時候會提示core dumped). 這時候可以檢視一下有沒有形如core.程序號的檔案生成, 這個檔

【已解決】Linux下出現Segmentation Faultcore dump)錯誤

今天被這個問題搞了半個小時,後來通過新增printf(...)語句的方法找到了錯誤原因,是因為在程式中錯誤的輸出一個為空的字串導致。。。 1. 段錯誤是什麼 一句話來說,段錯誤是指訪問的記憶體超出了系統給這個程式所設定的記憶體空間,例如訪問了不存在的記憶體地址、訪

編寫的windows程式崩潰時產生crash dump檔案的辦法 .

一、引言 dump檔案是C++程式發生異常時,儲存當時程式執行狀態的檔案,是除錯異常程式重要的方法,所以程式崩潰時,除了日誌檔案,dump檔案便成了我們查詢錯誤的最後一根救命的稻草。windows程式產生dump檔案和linux程式產生dump檔案的方式不一樣,linux預

段錯誤(sgementation fault)和核心已轉儲(core dump)的除錯方法

本文主要介紹gdb+core的除錯方法,其他幾種方法的介紹參考:段錯誤產生原因及除錯方法彙總 一、printf方法除錯 二、gdb方法除錯 三、gdb+core檔案的方法除錯,步驟如下,具體參考:gd

log沒有打出 rz -bye時提示core dump, scp上傳檔案失敗 今天是怎麼了!!!------都是磁碟滿了惹的火

       開發除錯的時候, 經常會遇到一些異常, 有的很棘手。 但如果每次嘗試去解決問題, 積累多了, 總結多了, 自然就有能快速知道原因了, 這就是所謂的經驗吧。        今天,        該打的log沒有打出, log戛然而已, 我開始以為core dum

python出現UnicodeEncodeError有可能產生的另一個原因

erro inux encode fault roo install 出現 div wrap 在使用python中,我們都有可能遇到如下的錯誤: UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in po