1. 程式人生 > >Linux生成core檔案、core檔案路徑設定

Linux生成core檔案、core檔案路徑設定

轉載自:http://www.nginx.cn/1521.html

在Linux下產生並除錯core檔案 先看看我用的是個什麼機器:

$ uname -a
Linux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 EDT 2004 i686 i686 i386 GNU/Linux

再看看預設的一些引數,注意core file size是個0,程式出錯時不會產生core檔案了。


$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7168
virtual memory (kbytes, -v) unlimited

寫個簡單的程式,看看core檔案是不是會被產生。

$ more foo.c

#include

static void sub(void);

int main(void)
{
sub();
return 0;
}

static void sub(void)
{
int *p = NULL;

/* derefernce a null pointer, expect core dump. */
printf("%d", *p);
}

$ gcc -Wall -g foo.c
$ ./a.out
Segmentation fault

$ ls -l core.*
ls: core.*: No such file or directory

沒有找到core檔案,我們改改ulimit的設定,讓它產生。1024是隨便取的,要是core檔案大於1024個塊,就產生不出來了。

$ ulimit -c 1024

$ ulimit -a
core file size (blocks, -c) 1024
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7168
virtual memory (kbytes, -v) unlimited

$ ./a.out
Segmentation fault (core dumped)
$ ls -l core.*
-rw------- 1 uniware uniware 53248 Jun 30 17:10 core.9128

注意看上述的輸出資訊,多了個(core dumped)。確實產生了一個core檔案,9128是該程序的PID。我們用GDB來看看這個core。

$ gdb --core=core.9128
GNU gdb Asianux (6.0post-0.20040223.17.1AX)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-asianux-linux-gnu".
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0 0x08048373 in ?? ()
(gdb) bt
#0 0x08048373 in ?? ()
#1 0xbfffd8f8 in ?? ()
#2 0x0804839e in ?? ()
#3 0xb74cc6b3 in ?? ()
#4 0x00000000 in ?? ()

此時用bt看不到backtrace,也就是呼叫堆疊,原來GDB還不知道符號資訊在哪裡。我們告訴它一下:

(gdb) file ./a.out
Reading symbols from ./a.out...done.
Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) bt
#0 0x08048373 in sub () at foo.c:17
#1 0x08048359 in main () at foo.c:8

此時backtrace出來了。

(gdb) l
8 sub();
9 return 0;
10 }
11
12 static void sub(void)
13 {
14 int *p = NULL;
15
16 /* derefernce a null pointer, expect core dump. */
17 printf("%d", *p);
(gdb)

在程式不尋常退出時,核心會在當前工作目錄下生成一個core檔案(是一個記憶體映像,同時加上除錯資訊)。使用gdb來檢視core檔案,可以指示出導致程式出錯的程式碼所在檔案和行數。

1.core檔案的生成開關和大小限制
---------------------------------
1)使用ulimit -c命令可檢視core檔案的生成開關。若結果為0,則表示關閉了此功能,不會生成core檔案。
2)使用ulimit -c filesize命令,可以限制core檔案的大小(filesize的單位為kbyte)。若ulimit -c unlimited,則表示core檔案的大小不受限制。如果生成的資訊超過此大小,將會被裁剪,最終生成一個不完整的core檔案。在除錯此core檔案的時候,gdb會提示錯誤。

2.core檔案的名稱和生成路徑
----------------------------
core檔案生成路徑:
輸入可執行檔案執行命令的同一路徑下。
若系統生成的core檔案不帶其他任何副檔名稱,則全部命名為core。新的core檔案生成將覆蓋原來的core檔案。

1)/proc/sys/kernel/core_uses_pid可以控制core檔案的檔名中是否新增pid作為擴充套件。檔案內容為1,表示新增pid作為副檔名,生成的core檔案格式為core.xxxx;為0則表示生成的core檔案同一命名為core。
可通過以下命令修改此檔案:
echo "1" > /proc/sys/kernel/core_uses_pid

2)proc/sys/kernel/core_pattern可以控制core檔案儲存位置和檔名格式。
可通過以下命令修改此檔案:
echo "/corefile/core-%e-%p-%t" > core_pattern,可以將core檔案統一生成到/corefile目錄下,產生的檔名為core-命令名-pid-時間戳
以下是引數列表:
%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時間
%h - insert hostname where the coredump happened into filename 新增主機名
%e - insert coredumping executable name into filename 新增命令名

3.core檔案的檢視
-----------------
core檔案需要使用gdb來檢視。
gdb ./a.out
core-file core.xxxx
使用bt命令即可看到程式出錯的地方。
以下兩種命令方式具有相同的效果,但是在有些環境下不生效,所以推薦使用上面的命令。
1)gdb -core=core.xxxx
file ./a.out
bt
2)gdb -c core.xxxx
file ./a.out
bt

4.開發板上使用core檔案除錯
-----------------------------
如果開發板的作業系統也是linux,core除錯方法依然適用。如果開發板上不支援gdb,可將開發板的環境(依賴庫)、可執行檔案和core檔案拷貝到PC的linux下。
在 PC上除錯開發板上產生的core檔案,需要使用交叉編譯器自帶的gdb,並且需要在gdb中指定solib-absolute-prefix和 solib-search-path兩個變數以保證gdb能夠找到可執行程式的依賴庫路徑。有一種建立配置檔案的方法,不需要每次啟動gdb都配置以上變數,即:在待執行gdb的路徑下建立.gdbinit。
配置檔案內容:
set solib-absolute-prefix YOUR_CROSS_COMPILE_PATH
set solib-search-path YOUR_CROSS_COMPILE_PATH
set solib-search-path YOUR_DEVELOPER_TOOLS_LIB_PATH
handle SIG32 nostop noprint pass


相關推薦

Linux生成core檔案core檔案路徑設定

轉載自:http://www.nginx.cn/1521.html 在Linux下產生並除錯core檔案 先看看我用的是個什麼機器: $ uname -a Linux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 ED

Linux C/C++語言標頭檔案檔案的查詢路徑

在程式設計中,檔案包含是很有用的。一個大的程式可以分為多個模組,由多個程式設計師分別程式設計。有        些公    用的符號常量或巨集定義等可單獨組成一個檔案,在其它檔案的開頭用包含命令包含該檔案即可使        用。這樣,可避免在每個檔案開頭都去書寫那些公

將頁面生成的圖片檔案pdf檔案儲存到伺服器地址

將頁面生成的圖片檔案、pdf檔案儲存到伺服器地址,引數$url為連結地址,$filename為要生成的檔名; /** * getPdfPath獲取簡歷生成的連結地址 */ private function getPath($url, $filename)

Linux中的原始檔目標檔案檔案

在說明Linux的.a、.so和.o檔案關係之前,先來看看windows下obj,lib,dll,exe的關係   windows下obj,lib,dll,exe的關係     lib是和dll對應的。lib是靜態連結庫的庫檔案,dll是動

C++ 基礎(五)使用vs2015封裝c++生成.dll檔案.lib檔案.h檔案後,給另一個工程使用:使用前,需配置標頭檔案(.h)靜態庫(.lib)和 動態庫(.dll )專案屬性

一、簡介 我是一個認真的人,要麼不寫,要麼我就把步驟、截圖、程式碼,一 一 附上,方便大家參考學習。 1、為什麼要生成DLL和lib?      就是為了給VS工程呼叫(比如C#呼叫、C++工程)。 2、C#為什麼要呼叫DLL和lib? C++寫的程

Linux 學習之建立刪除檔案和資料夾命令

今天學習了幾個命令,是建立、刪除檔案和資料夾的,在linux裡,資料夾是目錄,下面說下我學習的命令。 建立資料夾【mkdir】   一、mkdir命令使用許可權     所有使用者都可以在終端使用 mkdir 命令在擁有許可權的資料夾建立資料夾或目錄。     二

c++判斷硬碟是否連線修改指定碟符讀取配置檔案獲取exe路徑

系統:win7 64 編譯器:vs2010 mfc對話方塊程式。 工程名:fixde   語言:c++ 涉及函式: GetPrivateProfileString 讀取配置檔案內容,型別為string GetDriveType 獲取某驅動器狀態 GetVolum

iOS 9 建立plist 檔案檔案路徑查詢

#pragma mark-----------獲取plist檔案路徑------------------- - (NSString *)getFilePathWithFileName:(NSStrin

Linux中想進入一個目錄 在目錄下建立檔案檔案內部刪除檔案 各需要什麼許可權?

1.想進入一個目錄需要什麼許可權? 首先我們在超級使用者下建立一個dir_root目錄,並且取消它的所有許可權chmod 000 dir_root 當我們想進入dir_root目錄下的時候,發現就算dir_root對擁有者沒有讀、寫、可執行許可權,超級使用者依然可以進入

Linux進入目錄建立檔案顯示檔案分別需要什麼許可權?

問題一:Linux若想進入一個目錄需要什麼許可權? 綜上所述,在普通使用者下,若想進入一個目錄需要可執行許可權                   在超級使用者下,目錄不管具有什麼許可權都可以進入

實踐中學習vim之vim配置檔案外掛檔案載入路徑

0 引言 理解vim的啟動過程對於增強使用vim的信心非常重要,本文所有的資訊均來自vim自身提供的參考手冊和作者實際操作實踐。VIM REFERENCE MANUAL的Starting Vim這節詳細描述了vim的啟動過程。vim完整的啟動過程非常複雜,因為要相容不同的平

Keil生成彙編檔案bin檔案

// 生成彙編檔案:$K\ARM\ARMCC\bin\fromelf.exe --text -a -c [email protected]_asm.txt "!L"// 生成bin檔案:$K\ARM\ARMCC\bin\fromelf.exe --bin -o @L

linux下zip檔案7z檔案的解壓和壓縮

linux下zip檔案的解壓命令:unzip;壓縮命令:zip。具體參考文章1。 linux下7z檔案的解壓命令:7za x;壓縮命令:7za a。具體參考文章2. 注意: 1、linux預設情況下沒有安裝7z檔案的解壓縮命令,需要安裝。 2、線上安裝命令為:sudo ap

python基本操作-檔案目錄及路徑

[toc] > 使用python的os模組,簡單方便完成對資料夾、檔案及路徑的管理與訪問操作。 ## 1 前言 在最近開發中,經常需要對檔案進行讀取、遍歷、修改等操作,想要快速、簡單的完成這些操作,我選擇用 python 。通過 python 的標準內建 os 模組,只需要幾行程式碼,即可完成想

plsql匯入sql檔案dmp檔案

問題:一個dmp資料檔案, 通過plsql import匯入時,提示沒有 iml.exe檔案,原因本地沒安裝oracle。 很多時候需要通過sql指令碼,dmp檔案匯入資料,直接貼上、挪移sql很可能讓plsql直接宕掉,但是通過linux寫命令有時許可權不足登入不上,plsql提

Springboot讀取配置檔案pom檔案及自定義配置檔案

前言 很多人都知道讀取配置檔案,這是初級做法,上升一點難度是使用java bean的方式讀取自定義配置檔案,但是大家很少有知道讀取pom檔案資訊,接下來我都會講到。 正文 筆者還是基於Spring Boot ::        (v1.5.8.RE

【Python筆記】操作讀取Excel檔案文字檔案

需求:讀取Excel檔案、替換文字檔案中得指定某個字串並生成新的檔案 原始碼: #encoding:utf-8 # -*- coding: utf-8 -*- #!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2 #Author:

淺析C++中的開啟檔案儲存檔案(OPENFILENAME)

首先看看msdn上如何描述的: Contains information that the GetOpenFileName and GetSaveFileName functions use to initialize an Open or Save As dialog box

mysql與mariaDB涉及到的檔案(日誌檔案程序檔案套接字檔案

文章目錄 1、引數配置檔案 2、日誌檔案 2.1 錯誤日誌 2.2 慢查詢日誌 2.3 查詢日誌 2.4 二進位制日誌 3、套接字檔案 4、p

[Xcode10 實際操作]七檔案與資料-(3)建立文字檔案屬性列表檔案圖片檔案

本文將演示如何建立各種型別的檔案。 在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】 1 import UIKit 2 3 class ViewController: UIViewController { 4 5 override f