linux中core dump開啟使用教程


一、什么是coredump

我們經常聽到大家說到程序core掉了,需要定位解決,這里說的大部分是指對應程序由於各種異常或者bug導致在運行過程中異常退出或者中止,並且在滿足一定條件下(這里為什么說需要滿足一定的條件呢?下面會分析)會產生一個叫做core的文件。

通常情況下,core文件會包含了程序運行時的內存,寄存器狀態,堆棧指針,內存管理信息還有各種函數調用堆棧信息等,我們可以理解為是程序工作當前狀態存儲生成第一個文件,許多的程序出錯的時候都會產生一個core文件,通過工具分析這個文件,我們可以定位到程序異常退出的時候對應的堆棧調用等信息,找出問題所在並進行及時解決。

二、cored dump開啟

1、暫時生效
ulimit -c unlimited

2、永久生效
修改/etc/security/limits.conf

  • soft core unlimited
  • hard core unlimited

3、永久生效
修改/etc/profile

ulimit -c unlimited

三、設置core文件的名稱和文件路徑
默認生成路徑:輸入可執行文件運行命令的同一路徑下
默認生成名字:默認命名為core。新的core文件會覆蓋舊的core文件

a.設置pid作為文件擴展名

1:添加pid作為擴展名,生成的core文件名稱為core.pid
0:不添加pid作為擴展名,生成的core文件名稱為core
修改 /proc/sys/kernel/core_uses_pid 文件內容為: 1
修改文件命令:

echo "1" > /proc/sys/kernel/core_uses_pid
或者
sysctl -w kernel.core_uses_pid=1 kernel.core_uses_pid = 1

b. 控制core文件保存位置和文件名格式

修改文件命令: echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
或者:
sysctl -w kernel.core_pattern=/corefile/core.%e.%p.%s.%E
可以將core文件統一生成到/corefile目錄下,產生的文件名為core-命令名-pid-時間戳
以下是參數列表:
%p - insert pid into filename 添加pid(進程id)
%u - insert current uid into filename 添加當前uid(用戶id)
%g - insert current gid into filename 添加當前gid(用戶組id)
%s - insert signal that caused the coredump into the filename 添加導致產生core的信號
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成時的unix時間
%h - insert hostname where the coredump happened into filename 添加主機名
%e - insert coredumping executable name into filename 添加導致產生core的命令名

3.測試是否能生成core文件
kill -s SIGSEGV $$
查看/corefile目錄下是否生成了core文件

如果是需要測試go程序是否能生成core文件,需要設置環境變量GOTRACEBACK=crash

4.調試core文件
Eg. test.c

#include<stdio.h>

int main()
{
int *p = NULL;
*p = 0;
return 0;
}
root@ubuntu:~# gcc -o test test.c
root@ubuntu:~# ./test
Segmentation fault (core dumped)
bingo:這里出現段錯誤並生成core文件了
在/corefile目錄下發現core-test-31421-1476266571
開始調試
gdb ./test core-test-31421-1476266571

根據堆棧信息查看bug

  1. 基本GDB命令
    為了定位問題,常常需要進行單步跟蹤,設置斷點之類的操作。

下邊列出了GDB一些常用的操作。

啟動程序:run
設置斷點:b 行號|函數名
刪除斷點:delete 斷點編號
禁用斷點:disable 斷點編號
啟用斷點:enable 斷點編號
單步跟蹤:next (簡寫 n)
單步跟蹤:step (簡寫 s)
打印變量:print 變量名字 (簡寫p)
設置變量:set var=value
查看變量類型:ptype var
順序執行到結束:cont
順序執行到某一行: util lineno
打印堆棧信息:bt


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM