一、什麼是coredump
應用程式由於某些異常或者bug而被強制退出時,linux系統會在當前目錄或指定目錄下生成乙個core檔案,供使用者除錯定位程式異常出現的位置。core檔案包含了程式執行時記憶體、暫存器狀態、函式呼叫堆疊等除錯資訊。
二、core file的路徑檢視與設定
1、可通過如下命令檢視core file的生成路徑:
cat /proc/sys/kernel/core_pattern
2、core file檔案開關設定及名稱設定:
1)應判斷系統是否在程式down掉之後生成core file,通過ulimit -a可檢視當前系統資源的一些限制資訊,如圖:
這裡core file size 大小設定為0 ,是不會在程式down掉後生成core檔案的,可通過如下方式修改:
ulimit -c unlimited #設定允許當前生成沒有大小限制的core file
ulimit -c 1024 #設定限制當前生成的core file大小為1024,這裡單位為blocks,即為512 bytes
如欲關閉core file 生成,可如下設定:
ulimit -c 0
注:如果生成的core file超過所設定的大小,將會被裁剪,生成不完整的core,在用gdb工具對此core除錯的時候,將會提示錯誤。
2)設定core file 的生成路徑及命名格式。這裡可通過如下命令,將自定義路徑寫入/proc/sys/kernel/core_pattern,從而實現路徑設定。
echo "/data/corefile/core.%e.%p" > /proc/sys/kernel/core_pattern
此時,生成的core檔名為core.命令名.程序id
相應的引數如下:
%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 新增命令名
注:若 /proc/sys/kernel/core_uses_pid 為1,即使core_pattern中沒有設定%p,也會在生成的core檔名中新增程序id。core_uses_pid其值為1或0亦可通過echo命令設定。
3)上述的設定只作用於當前會話,重新登入後將失效,欲將上述設定永久生效,可通過如下設定:
將上圖標註的地方改為
上述配置對所有使用者有效,若需指定某使用者或使用者組,可如下設定:
注:上述配置需重新登入後生效,且經筆者試驗,ubuntu 下由於自身bug,萬用字元 * 只對所有非root使用者生效,欲對root生效,需手動將使用者名稱設定為『 root '。
三、gdb除錯core file
以下為筆者編寫的測試程式
對程式檔案編譯時需帶-g 選項生成除錯資訊
上述操作因傳入的除數為0,造成程式異常終止,通過gdb除錯可定位錯誤位置
通過常用的gdb命令,可進一步對程式除錯
l(list)
, 顯示源**,並且可以看到對應的行號;
b(break)x x
是行號,表示在對應的行號位置設定斷點;
p(print)x x
是變數名,表示列印變數x
的值r(run)
表示繼續執行到斷點的位置
n(next)
表示執行下一 步
c(continue)
表示繼續執行
q(quit)
表示退出gdb
bt n/-n 列印棧頂上n層/棧底下n層資訊(此處n為正整數)
f(frame) n 檢視某一層資訊(n為層數)
info frame 會打出更為詳盡的當前層的資訊
info args 列印出當前函式的引數名及其值
info locals 列印出當前函式中所有區域性變數及其值
info catch 列印出當前的函式中的異常處理資訊
up n 向上移n層 (無n,表向上移1層)
down n 向下移n層(無n,表向下移1層
core file介紹及初步分析
include include int main int argc,char argv if corefile fopen argv 1 r null fread c file,sizeof c file 1,corefile fclose corefile sprintf command,lque...
使用GDB 文字使用者介面(GDB TUI)進行除錯
1 開啟tui模式 使用 gdbtui q 或 gdb tui q 開始乙個除錯 2 在tui模式下有4個視窗,command 命令視窗.可以鍵入除錯命令 source 源 視窗.顯示當前行,斷點等資訊 assembly 彙編 視窗 register 暫存器視窗 除command 視窗外,其他三個視...
C C 程式除錯神器 GDB介紹
程式在ld的時候會給so設乙個載入位址,可以通過 ttext segment 0x12345678 去指定該so的位址。ldd exec gdb的info sharedlibrary可檢視其載入位址。程式在執行過程中訪問非法記憶體時,會丟擲異常,段錯誤 program terminated with...