看到上面的結果是不是有種老相識的感覺哈,接下來就嘗試使用core解決上面問題
core檔案
有問題的程式執行後,產生「segmentation fault」時生成的具有堆疊資訊和除錯資訊的檔案。
編譯時需要加 -g 選項使程式生成除錯資訊: gcc -g core_test.c -o core_test
配置生成 core 檔案
使用 ulimit -c 檢視core開關,如果為0表示關閉,不會生成core檔案;
使用 ulimit -c [filesize] 設定core檔案大小,當最小設定為4之後才會生成core檔案;
使用 ulimit -c unlimited 設定core檔案大小為不限制,這是常用的做法;
core檔案命名和儲存路徑
①core檔案有預設的名稱和路徑,但為了方便,我們通常會自己命名和指定儲存路徑;
②可以通過 /proc/sys/kernel/core_pattern 設定 core 檔名和儲存路徑,方法如下:
echo 「/corefile/core-%e-%p-%t」 > /proc/sys/kernel/core_pattern
命名的引數列表:
%p - insert pid into filename 新增pid
%u - insert current uid into filename 新增當前uid
%g - insert current gid into filename 新增當前gid
%s - insert signal that caused the coredump into the filename 新增導致產生core的訊號
%t - insert unix time that the coredump occurred into filename 新增core檔案生成時的unix時間
%e - insert coredumping executable name into filename 新增命令名。
除錯core檔案gdb [exec file] [core file]
上面基礎知識講完了,接下來將實戰看看
#include
using
namespace std;
intmain()
首先檢視core檔案是否開啟狀態,然後對上面檔案進行編譯,執行
執行之後,發現當前資料夾裡多了乙個檔案,沒錯,就是core檔案
這時。我們開始gdb的除錯
通過第二個框框的內容可以知道,由於執行了a[i]=i產生的錯誤,這是,檢視a和i的值,發現a的位址為0,沒有分配位址就直接使用,重新修改原始檔,對a進行分配記憶體重新編譯執行。執行ok
GDB除錯core檔案
1.什麼是core dump?core dump說的是作業系統執行的乙個動作,當某個程序因為一些原因意外終止 crash 的時候,作業系統會將這個程序當時的記憶體資訊轉儲 dump 到磁碟上,產生的檔案就是core檔案了,一般會以core.形式命名。2.那些訊號能夠引起core dump?經常用到的...
GDB除錯core檔案
core檔案是程式執行狀態的記憶體映像當程式執行過程 現segmentation fault core dumped 錯誤時,程式停止執行,並產生core檔案。使用gdb除錯core檔案可以幫我們快速定位程式出現段錯誤的位置。可執行程式編譯時應加上 g編譯選項,生成除錯資訊閉。當程式訪問的記憶體超出...
gdb除錯core檔案
本人最近正在學習除錯技術,此處對棧溢位做一些總結。gdb的基本使用就不多扯了。主要針對發行在外的release版本的軟體出現問題時的除錯。一般來講,檢視堆疊就是使用bt,這個時候加上bt full會讓你更加滿意,因為這裡面可以顯示出區域性變數資訊。另一點是檢視暫存器中的值,主要是sp和ip。指令 i...