1. 程式人生 > >C++中Segmentation fault(Core Dump)錯誤處理

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

什麼是Core Dump?
Core的意思是記憶體, Dump的意思是扔出來, 堆出來.
開發和使用Unix程式時, 有時程式莫名其妙的down了, 卻沒有任何的提示(有時候會提示core dumped). 這時候可以檢視一下有沒有形如core.程序號的檔案生成, 這個檔案便是作業系統把程式down掉時的記憶體內容扔出來生成的, 它可以做為除錯程式的參考.
core dump又叫核心轉儲, 當程式執行過程中發生異常, 程式異常退出時, 由作業系統把程式當前的記憶體狀況儲存在一個core檔案中, 叫core dump.

如何使用core檔案?
gdb -c core檔案路徑 [應用程式的路徑]
進去後輸入where回車, 就可以顯示程式在哪一行down掉的, 在哪個函式中.

為什麼沒有core檔案生成呢?


有時候程式down了, 但是core檔案卻沒有生成. core檔案的生成跟你當前系統的環境設定有關係, 可以用下面的語句設定一下, 然後再執行程式便成生成core檔案.
ulimit -c unlimited
沒有找到core檔案,我們改改ulimit的設定,讓它產生。1024是隨便取的,要是core檔案大於1024個塊,就產生不出來了。)
$ ulimit -c 1024 (轉者注: 使用-c unlimited不限制core檔案大小

core檔案生成的位置一般於執行程式的路徑相同, 檔名一般為core.程序號

4. 用gdb檢視core檔案:
下面我們可以在發生執行時訊號引起的錯誤時發生core dump了.
發生core dump之後, 用gdb進行檢視core檔案的內容, 以定位檔案中引發core dump的行.
gdb [exec file] [core file]

如:
gdb ./test test.core
在進入gdb後, 用bt命令檢視backtrace以檢查發生程式執行到哪裡, 來定位core dump的檔案->行.

===========================================================================

造成程式core dump的原因很多,這裡根據以往的經驗總結一下:

1 記憶體訪問越界

  a) 由於使用錯誤的下標,導致陣列訪問越界

  b) 搜尋字串時,依靠字串結束符來判斷字串是否結束,但是字串沒有正常的使用結束符

  c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字串操作函式,將目標字串讀/寫爆。應該使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函式防止讀寫越界。

2 多執行緒程式使用了執行緒不安全的函式。

應該使用下面這些可重入的函式,尤其注意紅色標示出來的函式,它們很容易被用錯:

asctime_r(3c) gethostbyname_r(3n) getservbyname_r(3n) ctermid_r(3s) gethostent_r(3n) getservbyport_r(3n) ctime_r(3c) getlogin_r(3c) getservent_r(3n) fgetgrent_r(3c) getnetbyaddr_r(3n) getspent_r(3c) fgetpwent_r(3c) getnetbyname_r(3n) getspnam_r(3c) fgetspent_r(3c) getnetent_r(3n) gmtime_r(3c) gamma_r(3m) getnetgrent_r(3n) lgamma_r(3m) getauclassent_r(3) getprotobyname_r(3n) localtime_r(3c) getauclassnam_r(3) etprotobynumber_r(3n) nis_sperror_r(3n) getauevent_r(3) getprotoent_r(3n) rand_r(3c) getauevnam_r(3) getpwent_r(3c) readdir_r(3c) getauevnum_r(3) getpwnam_r(3c) strtok_r(3c) getgrent_r(3c) getpwuid_r(3c) tmpnam_r(3s) getgrgid_r(3c) getrpcbyname_r(3n) ttyname_r(3c) getgrnam_r(3c) getrpcbynumber_r(3n) gethostbyaddr_r(3n) getrpcent_r(3n)

3 多執行緒讀寫的資料未加鎖保護。

對於會被多個執行緒同時訪問的全域性資料,應該注意加鎖保護,否則很容易造成core dump

4 非法指標

  a) 使用空指標

  b) 隨意使用指標轉換。一個指向一段記憶體的指標,除非確定這段記憶體原先就分配為某種結構或型別,或者這種結構或型別的陣列,否則不要將它轉換為這種結構或型別的指標,而應該將這段記憶體拷貝到一個這種結構或型別中,再訪問這個結構或型別。這是因為如果這段記憶體的開始地址不是按照這種結構或型別對齊的,那麼訪問它時就很容易因為bus error而core dump.

5 堆疊溢位

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

============================================================================

我發生的問題(待解決中):

main.h:
typedef struct TS_PAT
{
 UINT8 table_id;
 UINT32 zero;
} TS_PAT;

main.c:
TS_PAT *PAT_DataTable;

void Load_PAT_table(FILE *stream){
 PAT_DataTable->table_id = 1;
}
上記程式碼,編譯通過。


執行時:
Segmentation fault(core dumped)


用上記方法,最後的bt命令輸入後:
#0  0x080486e7 in Load_PAT_table (stream=0x804c050) at main.c:76
76  PAT_DataTable->table_id = 1;
(gdb) bt
#0  0x080486e7 in Load_PAT_table (stream=0x804c050) at main.c:76
#1  0x080487a5 in Parse_Adjust_PAT_table (stream=0x804c050) at main.c:137
#2  0x08049651 in main (argn=3, argc=0xbf96e284) at main.c:827

當註釋掉”PAT_DataTable->table_id = 1;“的時候,沒問題。
否則,在這行賦值語句執行時就down機。

原因:查明,,未對指標初始化(未分配起指向的記憶體空間)

相關推薦

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

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

C語言中的Segmentation fault (core dumped) 解決辦法

C語言中,Segmentation fault (core dumped)  即段錯誤造成原因:段錯誤就是指訪問的記憶體超出了系統所給這個程式的記憶體空間。一般是隨意使用野指標或者陣列、陣列越界。定位方法:    1、用輸出語句除錯,常用在單文件除錯,在認為指標使用錯誤的地方

Segmentation fault (core dumped)除錯資訊處理方式

Q:怎麼看core檔案是哪個程式產生的? A:file core.36833 有的程式可以通過編譯,但在執行時會出現Segment fault(段錯誤)。這通常都是指標錯誤引起的。但這不像編譯錯誤一樣會提示到檔案一行,而是沒有任何資訊。一種辦法是用gdb的step,一

GDB除錯php擴充套件錯誤(Segmentation fault (core dumped))

(gdb) print (char *)(executor_globals.function_state_ptr->function)->common.function_name (gdb) print (char *)executor_globals.act

錯誤Segmentation fault (core dumped)

該錯誤出現,是在我將C的程式碼在linux中編譯後執行的時候報錯; 科普後瞭解: Segmentation fault :這個提示還是比較常見的,這個提示就是段錯誤 Core Dump :有的時候給我們呈現的翻譯很有趣是”吐核“,但是實際上比較貼切的翻譯是核心轉儲(是作

ros rviz: Segmentation fault (core dumped) 與 [rviz -1] process has died [pid 10134, exit code -6]

工作 alt ack 問題 依賴 art roc register pre 1. 執行roslaunch 文件打開 某rviz文件。出現了例如以下的錯誤: [rviz-1] process has died [pid 10134, exit code -6] 2. 執

PDO 支持三種錯誤處理模式:

測試 語法 nbsp span cat 參數 不執行 處理異常 new PDO 支持三種錯誤處理模式: 靜默模式,警告模式,異常模式 靜默模式是默認的,需要修改的話,通過設置 PDO 對象的屬性完成。 $pdo->setAttribute(PDO::ATTR_ERRM

C#的多線程超時處理實踐

出現問題 可能性 readline col 似的 rms 應用 true 有一個 最近我正在處理C#中關於timeout行為的一些bug。解決方案非常有意思,所以我在這裏分享給廣大博友們。 我要處理的是下面這些情況: 我們做了一個應用程序,程序中有這麽一個模塊,它的功能向

ASP.NET Core應用錯誤處理

最近在學習蔣金楠的ASP.NET Core 系列 真的是長知識了,博主地址:https://www.cnblogs.com/artech 一、顯示開發者異常頁面 由於ASP.NET Core應用是面向多個客戶端請求,如果一個錯誤,它並不會影響整個應用的終止,出於安全的考慮,客戶端在預設情況下應該得不到報錯

記今天在執行程式時出現的segmentation fault(core dumped)

剛剛在複習資料結構的時候寫了一些單鏈表的操作,執行的時候出現segmentation fault(core dumped) 一番查錯後發現原來在寫初始化連結串列的時候形參少加了一級指標,修改完後可以正常執行,以為這就是造成segmentation fault 的原因。 過了一會想到我之前也有

C++出現c2011這種解析錯誤的情況有三種

1類沒有實現:解決,進行類的實現 2.解析函式~類名();    解決:改為~類名(){} 3.當類存在類的組合,或者自身呼叫自己的物件,如Point a(4,5); Point b(a);這種情況,也無法在Point.cpp檔案中實現類,要在標頭檔案中實現,否則就報

當import matplotlib.pyplot as ply 出現Segmentation fault (core dumped)

當我在py檔案中匯入matplotlib.pyplot後,在linux shell 執行py檔案時,出現Segmentation fault (core dumped)錯誤提示,谷歌之後,找到了解決的方法: import matplotlib as mpl mpl.use(

C#基礎(1) 異常實現基本錯誤處理

本文作為C#基礎知識的查漏補缺使用,所以並不全面. 參考書籍<<C#本質論>>,<<C#高階程式設計>> static void Main(string[] args) { WriteLine("Hello World!

【ros_problems】ROS rqt外掛開啟失敗Segmentation fault (core dumped)的解決辦法

系統版本:ROS Inidgo, Ubuntu LTS 14.04.5 今天在搗鼓如何在QT-Creator編輯器裡支援Python程式碼的補全功能。 查了一些資料,說要安裝PyQt,遂下載安裝之。 後面偶然發現rqt外掛無法使用,每次開啟時提示: Segmentation fa

C#對於json格式資料的處理

基本環境 vs2013 .NetFramework4.5 名稱空間:using Newtonsoft.Json.Linq Json字串不知道key值如何獲得value //假設瀏覽器返回的資料如下:     string response={"672":

c#的多執行緒異常處理

1.對於Thread操作的異常處理 public static void Main() {   try   {     new Thread (Go).Start();   }   catch (Exception ex)   {     // We'll never ge

在Word 巨集 VBA迴圈使用on error的錯誤處理方法

Word中的巨集採用VBA,但是不支援VB中的錯誤處理機制,只能on error設定錯誤陷阱的方法進行錯誤處理。一般有以下幾種方法: 方法一: On Error Resume Next 使用這種方法會在遇到錯誤語句時跳過此句,繼續執行下一句。 方法二: On Error

segmentation fault/violation --段錯誤/違規

當硬體告訴作業系統一個有問題的記憶體引用時,就會產生這種錯誤。作業系統通過向出錯的程序傳送一個訊號與之交流。訊號即一種事件通知或者一個軟體中斷,在NUIX系統程式設計中使用廣泛,但在應用程式程式設計中幾乎不使用。在預設的情況下,程序在收到“段錯誤”訊號後將進行資訊轉儲並終止。 一個小型的

【error】Segmentation fault (core dumped)

在安裝caffe時make, make all, make runtest, make pycaffe均成功完成 但是在make pytest時出現錯誤 Segmentation fault (core dumped) 如下 [[email protected]

sphinx啟動searchd服務時,報segmentation fault (段錯誤

   今天啟動殺掉 searchd服務,再重啟的時候,報segmentation fault ,頭疼的不行。恢復以前的配置也無濟於事。後來在同事的幫助下,開啟sphinx的debug模式(coreseek/bin/searchd --logdebug),  找到了問題。原來是有的索引資料異常了,從csft.c