文章一:Core Dump技術(shù)介紹
相關(guān)鏈接:http://blog.csdn.net/yclz/archive/2008/04/12/2284264.aspx
在開發(fā)和使用Linux程序時(shí),我們最怕的就是莫過于程序莫明其妙的當(dāng)?shù)袅耍m然對(duì)整個(gè)系統(tǒng)來說是沒有什么影響,但對(duì)于程序使用尤其是程序開發(fā)者來說,這顯然是難以忍受的,有這樣一種技術(shù),操作系統(tǒng)把程序當(dāng)?shù)魰r(shí)的內(nèi)容保存起來,讓我們?cè)诔绦蜷_發(fā)時(shí)作一個(gè)調(diào)試參考。
1、什么是core dump?
Core,即core memory, 指由一系列小當(dāng)納圈形的磁性材料組成的存儲(chǔ)器,這里不過是沿用了這一稱呼,而dump就是堆放的意思。core dump又叫核心轉(zhuǎn)儲(chǔ), 當(dāng)程序運(yùn)行過程中發(fā)生異常, 程序異常退出時(shí), 由操作系統(tǒng)把程序當(dāng)前的內(nèi)存狀況存儲(chǔ)在一個(gè)core文件中, 叫core dump.
2、如何打開core dump支持?
有的操作系統(tǒng)并沒有默認(rèn)打開core dump支持,需要用ulimit -c unlimited語句進(jìn)行設(shè)置,core文件生成的位置一般在程序運(yùn)行的當(dāng)前目錄下,文件名為core.進(jìn)程號(hào)(當(dāng)然不同的系統(tǒng)也許有所不同,可以查看相手冊(cè)對(duì)路徑和文件名進(jìn)行設(shè)置).
3、Core dump的使用方法
首先應(yīng)該在用gcc進(jìn)行編譯時(shí)選擇-g選項(xiàng),以便起動(dòng)debug支持,生成可執(zhí)行文件時(shí)ex,./ex運(yùn)行可執(zhí)行文件,如果程序當(dāng)?shù)?,則會(huì)生成一個(gè)core文件,假設(shè)為core.1568,則gdb ex core.1568進(jìn)入gdb,然后再用where命令進(jìn)行查看即可。
4、舉例說明
假設(shè)我的代碼main.c為:
顯然有一個(gè)被零除的錯(cuò)誤,用gcc –g main.c –o main進(jìn)行編譯,然后./main執(zhí)行,不可避免的程序要down掉,然后用gdb main core文件名 進(jìn)行分析,然后你就能看到分析結(jié)果,采用這種方法,可以找到程序運(yùn)行的大部分bug.
5、其它-用kill命令查詢信號(hào)的名稱和值
有時(shí)候core dump顯示的結(jié)果是一些信號(hào)的值,這時(shí)需要對(duì)這些值進(jìn)行查詢,這時(shí)要用到kill命令。
Kill –l :列出所有信號(hào)的名稱和值
Kill –l val:查詢值為val的信號(hào)名稱
Kill –l signame: 查詢signame信號(hào)的值。
本文總結(jié)了core dump技術(shù)的基本使用方法,并進(jìn)行了舉例,對(duì)于初學(xué)Linux程序開發(fā)者來說,多多少少會(huì)有點(diǎn)幫助。
備注:此次 kill -l 8 得到 FPE,
在終端下:man 7 signal 查得:SIGFPE 8 Core Floating point exception
附:
文章二:
在Linux下產(chǎn)生并調(diào)試core文件
相關(guān)鏈接: http://blog.china-pub.com/more.asp?name=uniware&id=35478
先看看我用的是個(gè)什么機(jī)器:
$ uname -a
Linux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 EDT 2004 i686 i686 i386 GNU/Linux
再看看默認(rèn)的一些參數(shù),注意core file size是個(gè)0,程序出錯(cuò)時(shí)不會(huì)產(chǎn)生core文件了。
寫個(gè)簡(jiǎn)單的程序,看看core文件是不是會(huì)被產(chǎn)生。
沒有找到core文件,我們改改ulimit的設(shè)置,讓它產(chǎn)生。1024是隨便取的,要是core文件大于1024個(gè)塊,就產(chǎn)生不出來了。
注意看上述的輸出信息,多了個(gè)(core dumped)。確實(shí)產(chǎn)生了一個(gè)core文件,9128是該進(jìn)程的PID。我們用GDB來看看這個(gè)core。
此時(shí)用bt看不到backtrace,也就是調(diào)用堆棧,原來GDB還不知道符號(hào)信息在哪里。我們告訴它一下:
此時(shí)backtrace出來了。
相關(guān)鏈接:http://www.chinaitpower.com/2005September/2005-09-13/203684.html
1、開啟系統(tǒng)的Core Dump功能
ulimit -c core_file_size_in_kb
如果要關(guān)閉該功能core_file_size_in_kb為0就行了。
2、設(shè)置Core Dump的核心轉(zhuǎn)儲(chǔ)文件目錄和命名規(guī)則
文件的命名規(guī)則放在
/proc/sys/kernel/core_name_format文件中
使用sysctl -w "kernel.core_name_format=/coredump/%n.core"
上例的core文件放在/coredump目錄下,文件名是進(jìn)程名+.core
以下是一些命名的格式說明
%P The Process ID (current->pid)
%U The UID of the process (current->uid)
%N The command name of the process (current->comm)
%H The nodename of the system (system_utsname.nodename)
%% A "%"
3、分析核心轉(zhuǎn)儲(chǔ)文件
程序如下:
該程序運(yùn)行到i=5時(shí),會(huì)發(fā)生浮點(diǎn)運(yùn)算錯(cuò)誤(被除數(shù)等于0,j=0)
編譯上面的程序
gcc -g main.c -o eg
./eg
發(fā)生core-dump后,如果核心轉(zhuǎn)儲(chǔ)文件是core.2098,執(zhí)行下面的命令
gdb eg core.2098
可以看到當(dāng)時(shí)的信息,此出不方便錄入。
4、雜項(xiàng)
kill -l
上面命令列出所有信號(hào)的名稱和值
kill -l val
查詢值為val的信號(hào)名稱
kill -l signame
查詢signame信號(hào)的值
附錄 A. IBM AIX中產(chǎn)生Core文件的方法(來源于IBM cn)
Document #: 1311993F06001
環(huán)境:(產(chǎn)品,平臺(tái),機(jī)型,軟件版本,等)
平臺(tái):RS
軟件版本:AIX4.3 or later
問題描述:
如果用戶需要為一個(gè)應(yīng)用進(jìn)程產(chǎn)生一個(gè)完整的core文件用于分析,如何做?
解答:
1. 前提條件
在產(chǎn)生core文件之前,先要配置系統(tǒng)參數(shù)以確認(rèn)系統(tǒng)可以產(chǎn)生一個(gè)完整的core文件。另外,文件系統(tǒng)中還需要有足夠的剩余空間用于存放所產(chǎn)生的core文件。core文件通常存放在進(jìn)程屬主用戶的主目錄中。
2. 什么時(shí)候要產(chǎn)生完整地Core文件
缺省情況下,進(jìn)程不會(huì)產(chǎn)生一個(gè)完整的core文件。如果需要跟蹤調(diào)試一個(gè)應(yīng)用的共享內(nèi)存段中的數(shù)據(jù),特別是線程堆棧中的數(shù)據(jù),則需要產(chǎn)生一個(gè)完整的core dump文件用于分析。
3. 若需要產(chǎn)生完整的core文件信息,首先需要以root身份執(zhí)行下面的命令:
上述命令也可以通過smitty來完成:
將上面列表中的“ Enable full CORE dump ”項(xiàng)設(shè)置為“true”。
4. 使用下面的命令產(chǎn)生一個(gè)core文件:
# kill -11
注意:上面的命令同時(shí)也會(huì)殺掉指定的進(jìn)程。
附錄 B. 如何查看C程序產(chǎn)生的CORE DUMP(來源于IBM cn)
Document #: 1317181000005
環(huán)境
產(chǎn)品:IBM C 和C++ Compiler
平臺(tái):AIX4.3.0以上
版本: C for AIX version 3 以上
問題描述
如何查看C程序產(chǎn)生的CORE DUMP,并找到產(chǎn)生問題的根源?
解答
在AIX操作系統(tǒng)上查看C程序產(chǎn)生的CORE DUMP,可以使用AIX操作系統(tǒng)提供的命令:dbx. 如果用戶在使用時(shí)發(fā)現(xiàn)無此命令,則需安裝 操作系統(tǒng)的文件包:bos.adt.debug。
具體使用dbx命令的方法如下:
1。首先在進(jìn)行C程序 編譯時(shí),要使用-g選項(xiàng)。
cc -g -o samp1.o samp1.c
2.在執(zhí)行完程序,并產(chǎn)生CORE DUMP文件core后,使用:dbx samp1.o core 命令可查看CORE DUMP。
要想找到是哪個(gè)函數(shù)或語句引起的問題,在dbx的命令行再輸入where,即可顯示出所需的信息。dbx的命令行還可執(zhí)行多種命令以完成不同的查看功能,用戶可通過help命令了解這些命令。
相關(guān)鏈接:http://www.huihoo.org/gnu/linux/core.html
Core Dump?!
整理:Wilbur Lang
何謂 core?
在使用半導(dǎo)體作為內(nèi)存的材料前,人類是利用線圈當(dāng)作內(nèi)存的材料(發(fā)明 者為王安),線圈就叫作 core ,用線圈做的內(nèi)存就叫作 core memory。如今 ,半導(dǎo)體工業(yè)澎勃發(fā)展,已經(jīng)沒有人用 core memory 了,不過,在許多情況下, 人們還是把記憶體叫作 core 。
何謂 core dump?
我們?cè)陂_發(fā)(或使用)一個(gè)程序時(shí),最怕的就是程序莫明其妙地當(dāng)?shù)?。雖然系 統(tǒng)沒事,但我們下次仍可能遇到相同的問題。于是這時(shí)操作系統(tǒng)就會(huì)把程序當(dāng)?shù)?時(shí)的內(nèi)存內(nèi)容 dump 出來(現(xiàn)在通常是寫在一個(gè)叫 core 的 file 里面),讓 我們或是 debugger 做為參考。這個(gè)動(dòng)作就叫作 core dump。
為何會(huì)發(fā)生 core dump?
前面說過,在程序當(dāng)?shù)魰r(shí)出錯(cuò)。在 C/C++語言中,最常發(fā)生錯(cuò)誤的地方就是指 針有問題。您可以利用 core 文件和 debugger 把錯(cuò)誤找出來(要怎麼在 debugger 中使用 core 文件?man 一下 gdb 吧?。?。
我可以把 core 文件刪掉嗎?
如果你不會(huì)、不能、不需要修改程序,那就放心地把它刪除了吧!
要怎麼才不會(huì)讓 core 文件出現(xiàn)?
如果用的是tcsh的話, 以試著在 .tcshrc 里加一行:
limit coredumpsize 0
如果用的是bash的話, 在/etc/profile里加上(或者修改)一條:
ulimit -c 0
有一招, 可以讓你看出 core 最好用的地方 :)
gdb -c core, 進(jìn)去後打 where, 就可以 show 出你是在程序哪一行當(dāng)?shù)舻? 還有在當(dāng)?shù)魰r(shí)在哪個(gè) function 里, 這個(gè) function 是被哪個(gè) function 所 call 的, 而這個(gè) function 又是被哪個(gè) function 所 call 的.... 一直到 main()
由這個(gè)信息, 可以找出五六成的 bug........ 屢試不爽
但, 先決條件, 當(dāng)你在 compile 時(shí)必須把 debug information 的選項(xiàng)打開 不然, 就會(huì)出現(xiàn)一大堆你看不懂的東西,而不是你喜歡的源程序。
聯(lián)系客服