如何解決段錯誤

2021-08-11 17:54:06 字數 2023 閱讀 3718

程式執行時崩潰應該是經常遇到的事情,本篇文中就來講解一下在linux下如何解決程式崩潰,也就是發生了段錯誤之後找到程式具體出錯的地方。

如果程式通過了編譯,但是在使用命令 ./  a.out 執行時程式崩潰了,即顯示  段錯誤(core dumped)

其實系統會在程式崩潰的那一剎那將整個核心的資訊記錄在乙個檔案裡邊,(ls 並不會看到這個檔案)

使用命令 ulimit -a 開啟ulimit這個檔案 發現這個檔案大小預設為0 檔案根本就裝不進去

那麼就需要我們手動將這個檔案的大小改大一點。

使用 命令 ulimit  -c 10240  (10240的位置可以是任意乙個比較大的數字)

然後再利用 ./ 執行一次。

當再次使用 ls

檢視會發現這個 core.3288  檔案就存在了 ----(3288表示產生這個檔案的程序的 id)

可以使用命令 file core.3288 ,將core.3288這個檔案的具體資訊給顯示出來,命令最後會顯示這個core檔案是通過哪個檔案產生的(假如是a.out)

ps:file命令是用來探測給定檔案的型別。file命令對檔案的檢查分為檔案系統、魔法幻數檢查和語言檢查3個過程。

接下來來除錯分析問題到底出現在哪

使用命令   gdb 產生該core檔案的檔名 core檔案檔名    比如說  gdb a.out core.11277   然後回車

這個時候就會直接告訴我們問題出在哪個函式哪一行。

需要說明一下的是當前已經進入了除錯模式,按 q 退出除錯模式,然後就可以vim 我們的原始檔根據錯誤資訊修改我們的**了。

注意:調段錯誤,編譯的時候一定要加入-g選項,要不然在最後顯示錯誤的時候只會顯示錯的位址,而不會顯示錯誤的具體資訊

下邊就以乙個極其簡單的例子來具體顯示一下解決段錯誤的整個過程

使用命令 vim  test.c  開啟test.c這個原始檔,按 i 進行編輯,輸入如下程式

很明顯這個程式是有問題的,在funtest函式中,對null進行了解引用,這勢必會導致程式崩潰,接下來就來通過這個簡單的問題**來幫助理解怎麼解決斷錯誤。

使用:wq 退出 test.c 這個檔案回到命令模式,利用命令 gcc -g test.c  編譯test.c,順利通過編譯。

使用命令 ls 檢視一下,發現多了乙個a.out 可執行檔案。

然後再使用命令 ./a.out 執行,這個時候問題就來了

使用命令 ulimit -a 

重新執行一下然後再次使用 ls 命令檢視,多了乙個 core檔案

利用命令 file core.3288檢視一下這個檔案的具體資訊

然後使用命令 gdb a.out core.3288

最後 按 q 退出除錯模式,然後修改我們的**就ok了。

總結:解決段錯誤主要就是如下幾個步驟

step1:gcc -g 

step2:ulimit -c 10240

step3 : ./a.out

step4 : gdb a.out core檔案

如何解決 「 段錯誤 吐核 」 ???

一 段錯誤的形式 在程式設計中以下幾類做法容易導致段錯誤,基本上是錯誤地使用指標引起的。1 訪問系統資料區,尤其是往系統保護的記憶體位址寫資料最常見就是給乙個指標以0位址。2 記憶體越界 陣列越界,變數型別不一致等 訪問到不屬於你的記憶體區域。解決方法 我們在用c c 語言寫程式的時候,記憶體管理的...

Workflow常見錯誤如何解決

workflow在cluster跑的時候經常會出現一些錯誤。一般有下面幾種辦法解決 1.重啟。刪掉gen,workspace資料夾後重新跑一次。2.檢視vektor.log。根據關鍵字查詢vektor.log檔案裡面的資訊,定位錯誤。3.如果在local可以跑通,在cluster跑不通一般 1.檢查...

如何解決登入元件錯誤 4 ?

電腦管家提示 登入元件錯誤 4 qq提示 initialization failure 0x0000000c 很多軟體都不能正常使用。這個時候,電腦是否已經斷網,無法連網?該問題是由於winsock 目錄異常導致,很可能是由於winsock目錄被惡意程式篡改破壞,解決方法如下 不論是win8系統還是...