新聞中心
Linux操作系統(tǒng)是一款開(kāi)源的,使用極其廣泛的操作系統(tǒng)。在我們進(jìn)行軟件開(kāi)發(fā)或是系統(tǒng)維護(hù)的過(guò)程中,難免會(huì)遇到一些問(wèn)題,此時(shí)就需要進(jìn)行調(diào)試了。在Linux系統(tǒng)中,一種非常常見(jiàn)的調(diào)試方法就是通過(guò)分析core文件來(lái)進(jìn)行問(wèn)題排查,本文就將詳細(xì)介紹如何通過(guò)Linux命令進(jìn)行分析core文件以進(jìn)行調(diào)試。

創(chuàng)新互聯(lián)建站是一家專業(yè)從事成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)的品牌網(wǎng)絡(luò)公司。如今是成都地區(qū)具影響力的網(wǎng)站設(shè)計(jì)公司,作為專業(yè)的成都網(wǎng)站建設(shè)公司,創(chuàng)新互聯(lián)建站依托強(qiáng)大的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營(yíng)經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站建設(shè)及網(wǎng)站設(shè)計(jì)開(kāi)發(fā)服務(wù)!
一、什么是core文件
在Linux系統(tǒng)中,當(dāng)一個(gè)進(jìn)程崩潰時(shí),系統(tǒng)就會(huì)生成一個(gè)稱為core文件的文件。core文件包含了進(jìn)程崩潰時(shí)的內(nèi)存狀態(tài)、寄存器狀態(tài)、程序指針等信息,通常會(huì)非常的大(通常情況下都是進(jìn)程崩潰原因的關(guān)鍵提示)。這些信息都可以被用來(lái)定位問(wèn)題的位置和原因。
二、如何生成core文件
要生成core文件,我們需要做兩件事情。我們需要確保系統(tǒng)在進(jìn)程崩潰時(shí)可以生成core文件。我們需要使用gdb來(lái)調(diào)試進(jìn)程,這樣我們才能夠使用gdb來(lái)分析core文件。
1.系統(tǒng)生成core文件的方式
我們可以通過(guò)ulimit命令來(lái)查看當(dāng)前系統(tǒng)允許生成core文件的大小,如果為0則表明系統(tǒng)不會(huì)生成core文件。
“`
$ ulimit -c
“`
我們可以通過(guò)修改/etc/security/limits.conf文件來(lái)確保系統(tǒng)對(duì)于某個(gè)用戶,允許生成core文件。
打開(kāi)limits.conf文件,并添加以下兩行內(nèi)容:
“`
username soft core unlimited
username hard core unlimited
“`
其中,username表示用戶名,soft表示軟限制,hard表示硬限制,core表示core文件,unlimited表示無(wú)限制。添加完成后,保存并退出文件即可。此時(shí)我們可以通過(guò)以下命令來(lái)檢查修改是否生效:
“`
$ ulimit -a
“`
2.使用gdb調(diào)試進(jìn)程生成core文件
首先我們需要編譯程序時(shí)加入-g選項(xiàng),這樣程序就會(huì)包含調(diào)試信息。
“`
$ gcc -g mn.c -o mn
“`
接著我們可以通過(guò)以下命令啟動(dòng)gdb并附加到進(jìn)程中:
“`
$ gdb mn
(gdb) run
“`
等待程序運(yùn)行并崩潰后,會(huì)收到以下提示:
“`
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400537 in func ()
(gdb) bt
“`
此時(shí)我們可以通過(guò)輸入bt命令來(lái)查看調(diào)用堆棧。我們還可以通過(guò)設(shè)置core文件的大小來(lái)確??梢陨蒫ore文件。
“`
$ ulimit -c unlimited
“`
設(shè)置完成后再次運(yùn)行程序,等待程序崩潰,此時(shí)我們就可以看到在程序運(yùn)行所在目錄下會(huì)生成一個(gè)名為core的文件,這就是我們要分析的文件。
三、分析core文件
我們可以通過(guò)以下命令來(lái)分析core文件:
“`
$ gdb mn core
“`
其中,mn為程序的可執(zhí)行文件,core為要分析的core文件。運(yùn)行完成后,命令行會(huì)提示:
“`
Reading symbols from mn…(no debugging symbols found)…done.
[New LWP 14066]
Core was generated by `./mn’.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x0000000000400537 in func ()
“`
此時(shí)我們可以通過(guò)bt命令來(lái)查看調(diào)用堆棧:
“`
(gdb) bt
“`
除了可以查看調(diào)用堆棧外,我們還可以通過(guò)以下命令來(lái)查看代碼:
“`
(gdb) list
“`
同時(shí),我們還可以通過(guò)以下命令來(lái)查看變量的值:
“`
(gdb) print variable
“`
我們可以通過(guò)以下命令來(lái)跳轉(zhuǎn)到某一行代碼:
“`
(gdb) jump line_number
“`
這樣,我們就可以通過(guò)分析core文件來(lái)定位程序崩潰的原因和位置。
Linux系統(tǒng)中,通過(guò)分析core文件來(lái)進(jìn)行調(diào)試可以說(shuō)是非常方便、快速的一種調(diào)試方法,可以幫助我們快速定位程序的問(wèn)題,快速解決問(wèn)題。上面就是我在使用Linux系統(tǒng)時(shí),通過(guò)的方法。希望本文對(duì)你有所幫助。
相關(guān)問(wèn)題拓展閱讀:
- linux 下如何打開(kāi)core dump文件開(kāi)關(guān)
- 如何查詢和修改Linux操作系統(tǒng)生成core dump文件的默認(rèn)路徑?
- 如何使用GDB調(diào)試Coredump文件
linux 下如何打開(kāi)core dump文件開(kāi)關(guān)
dump文件可以在程序crash時(shí),方便我們查看程序crash的地方和上下文信息。在window下,要能生成dump文件,需要自己編寫(xiě)相應(yīng)的代碼。不過(guò)現(xiàn)在網(wǎng)上可以找到相應(yīng)的代碼,只要把它下載后然后加到自己的工程中去,就可以了!
在linux下面就簡(jiǎn)單的許多。只要打開(kāi)相應(yīng)的開(kāi)關(guān),linux會(huì)自動(dòng)在程序crash時(shí)生成相應(yīng)的core文件。這個(gè)文件和window下的dump文件類似。
下面是簡(jiǎn)單的一些步驟:
1.查看當(dāng)前是否已經(jīng)打開(kāi)了此開(kāi)關(guān)
通過(guò)命令:ulimit -c 如果輸出為 0
,則代表沒(méi)有打開(kāi)。如果為unlimited則已經(jīng)打開(kāi)了,就沒(méi)必要在做打開(kāi)。
2.通過(guò)命令打開(kāi)
ulimit -c unlimited .然后通過(guò)步驟1,可以監(jiān)測(cè)是否打開(kāi)成功。
3.如果你要取消,很簡(jiǎn)單:ulimit -c 0 就可以了
通過(guò)上面的命令修改后,一般都只是對(duì)當(dāng)前會(huì)話起作用,當(dāng)你下次重新登錄后,還是要重新輸入上面的命令,所以很麻煩。我們可以把通過(guò)修改
/etc/profile文件 來(lái)使系統(tǒng)每次自動(dòng)打開(kāi)。步驟如下:
1.首先打開(kāi)/etc/profile文件
一般都可以在文件中找到 這句語(yǔ)句:ulimit -S -c 0 /dev/null
2&1.ok,根據(jù)上面的例子,我們只要把那個(gè)0 改為
unlimited 就ok了。然后保存退出。
2.通過(guò)source /etc/profile 使當(dāng)期設(shè)置生效。
3.通過(guò)ulimit -c 查看下是否已經(jīng)打開(kāi)。
其實(shí)不光這個(gè)命令可以加入到/etc/profile文件中,一些其他我們需要每次登錄都生效的都可以加入到此文件中,因?yàn)榈卿洉r(shí)linux都會(huì)加載此文件。比如一些環(huán)境變量的設(shè)置。
還有一種方法可以通過(guò)修改/etc/security/limits.conf文件來(lái)設(shè)置,這個(gè)方法沒(méi)有試過(guò),也是網(wǎng)上看到。不過(guò)上面兩種就可以了!
最后說(shuō)一下生成core
dump文件的位置,默認(rèn)位置與可執(zhí)行程序在同一目錄下,文件名是core.***,其中***是一個(gè)數(shù)字。core
dump文件名的模式保存在/proc/sys/kernel/core_pattern中,缺省值是core。通過(guò)以下命令可以更改core
dump文件的位置(如希望生成到/tmp/cores目錄下)
echo “/tmp/cores/core”
/proc/sys/kernel/core_pattern
設(shè)置完以后我們可以做個(gè)測(cè)試,寫(xiě)個(gè)程序,產(chǎn)生一個(gè)異常。然后看到當(dāng)前目錄會(huì)有個(gè)core*的文件。然后我們可以
gdb core。* 程序 進(jìn)行調(diào)試。
如何查詢和修改Linux操作系統(tǒng)生成core dump文件的默認(rèn)路徑?
經(jīng)過(guò)分析發(fā)現(xiàn)系統(tǒng)默啟扒唯認(rèn)的core文件生成路徑是/var/logs,但/var/logs目錄并非此螞系統(tǒng)自帶的,系統(tǒng)初始安裝默認(rèn)自帶的是/var/log,最終導(dǎo)致該系悄培統(tǒng)出現(xiàn)core dump后并沒(méi)能生成core文件,因此如何查詢和修改系統(tǒng)默認(rèn)的core dump文件生產(chǎn)路徑呢?方法如下:一. 查詢core dump文件路徑: 方法1:# cat /proc/sys/kernel/core_pattern方法2:# /in/sysctl kernel.core_pattern二. 修改core dump文件路徑: 方法1:臨時(shí)修改:修改/proc/sys/kernel/core_pattern文件,但/proc目錄本身是動(dòng)態(tài)加載的,每次系統(tǒng)重啟都會(huì)重新加載,因此這種方法只能作為臨時(shí)修改。/proc/sys/kernel/core_pattern例:echo ‘/var/log/%e.core.%p’ > /proc/sys/kernel/core_pattern方法2:永久修改:使用sysctl -w name=value命令。例:/in/sysctl -w kernel.core_pattern=/var/log/%e.core.%p為了更詳盡的記錄core dump當(dāng)時(shí)的系統(tǒng)狀態(tài),可通過(guò)以下參數(shù)來(lái)豐富core文件的命名:%% 單個(gè)%字符
如何使用GDB調(diào)試Coredump文件
一般這種情況都是因?yàn)閿?shù)組越界訪問(wèn),空指針或是野指針讀寫(xiě)造成的。程序小的話還比較好辦,對(duì)著源代碼仔細(xì)檢查就能解決。但是對(duì)于代碼量較大的程序,里邊包含N多函數(shù)調(diào)用,N多數(shù)組指針訪問(wèn),這時(shí)想定位問(wèn)題就不是很容易了(此時(shí)牛人依然可以通過(guò)在適當(dāng)位置打printf加二分查找的方式迅速定位:P)。懶人的顫晌含話還是直接GDB搞起吧。 神馬是Core Dump文件偶爾就能聽(tīng)見(jiàn)某程序員同學(xué)抱怨“擦,又出Core了!”。簡(jiǎn)單來(lái)說(shuō),core dump說(shuō)的是操作系統(tǒng)執(zhí)行的一個(gè)動(dòng)作,當(dāng)某個(gè)進(jìn)程因?yàn)橐恍┰蛞馔饨K止(crash)的時(shí)候,操作系統(tǒng)會(huì)將這個(gè)進(jìn)程當(dāng)時(shí)的內(nèi)存信息轉(zhuǎn)儲(chǔ)(dump)到磁盤(pán)上1。產(chǎn)生的文件就是core文件了,一般會(huì)以core.xxx形式命名。 如何產(chǎn)生Core Dump 發(fā)生doredump一般都是在進(jìn)程收到某個(gè)信號(hào)的時(shí)候,Linux上謹(jǐn)中現(xiàn)在大概有60多個(gè)信號(hào),可以使用 kill -l 命令全部列出來(lái)。sagi@sagi-laptop:~$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX針對(duì)特定的信號(hào),應(yīng)用程序可以寫(xiě)對(duì)應(yīng)的信號(hào)處理函數(shù)。如果不指定,則采取默認(rèn)的處理方式, 默認(rèn)處理是coredump的信號(hào)如下:3)SIGQUIT 4)SIGILL 6)SIGABRT 8)SIGFPE 11)SIGSEGV 7)SIGBUS 31)SIGSYS 5)SIGTRAP 24)SIGXCPU 25)SIGXFSZ 29)SIGIOT 我們看到SIGSEGV在其中,一般數(shù)組越界或是訪問(wèn)空指針都會(huì)產(chǎn)生這個(gè)信號(hào)。另外雖然默認(rèn)是這樣的,但是你也可以寫(xiě)自己的信號(hào)處理函數(shù)改變默認(rèn)行為,更多信號(hào)相關(guān)可以看參考茄笑鏈接33。 上述內(nèi)容只是產(chǎn)生coredump的必要條件,而非充分條件。要產(chǎn)生core文件還依賴于程序運(yùn)行的shell,可以通過(guò)ulimit -a命令查看,輸出內(nèi)容大致如下:sagi@sagi-laptop:~$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheng priority (-e) 20 file size (blocks, -f) unlimited pending signals (-i)max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q)real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited 看到之一行了吧,core file size,這個(gè)值用來(lái)限制產(chǎn)生的core文件大小,超過(guò)這個(gè)值就不會(huì)保存了。我這里輸出是0,也就是不會(huì)保存core文件,即使產(chǎn)生了,也保存不下來(lái)==! 要改變這個(gè)設(shè)置,可以使用ulimit -c unlimited。 OK, 現(xiàn)在萬(wàn)事具備,只缺一個(gè)能產(chǎn)生Core的程序了,介個(gè)對(duì)C程序員來(lái)說(shuō)太容易了。#include ; #include ; int crash() { char *xxx = “crash!!”; xxx = ‘D’; // 寫(xiě)只讀存儲(chǔ)區(qū)! return 2; } int foo() { return crash(); } int main() { return foo(); } 上手調(diào)試 上邊的程序編譯的時(shí)候有一點(diǎn)需要注意,需要帶上參數(shù)-g, 這樣生成的可執(zhí)行程序中會(huì)帶上足夠的調(diào)試信息。編譯運(yùn)行之后你就應(yīng)該能看見(jiàn)期待已久的“Segment Fault(core dumped)”或是“段錯(cuò)誤 (核心已轉(zhuǎn)儲(chǔ))”之類的字眼了??纯串?dāng)前目錄下是不是有個(gè)core或是core.xxx的文件。祭出linux下經(jīng)典的調(diào)試器GDB,首先帶著core文件載入程序:gdb exefile core,這里需要注意的這個(gè)core文件必須是exefile產(chǎn)生的,否則符號(hào)表會(huì)對(duì)不上。載入之后大概是這個(gè)樣子的:sagi@sagi-laptop:~$ gdb coredump core Core was generated by ./coredump’. Program terminated with signal 11, Segmentation fault. #0 0x080483a7 in crash () at coredump.c:8 8 xxx = ‘D’; (gdb)我們看到已經(jīng)能直接定位到出core的地方了,在第8行寫(xiě)了一個(gè)只讀的內(nèi)存區(qū)域?qū)е掠|發(fā)Segment Fault信號(hào)。在載入core的時(shí)候有個(gè)小技巧,如果你事先不知道這個(gè)core文件是由哪個(gè)程序產(chǎn)生的,你可以先隨便找個(gè)代替一下,比如/usr/bin/w就是不錯(cuò)的選擇。比如我們采用這種方法載入上邊產(chǎn)生的core,gdb會(huì)有類似的輸出:sagi@sagi-laptop:~$ gdb /usr/bin/w core Core was generated by ./coredump’. Program terminated with signal 11, Segmentation fault. #0 0x080483a7 in ? () (gdb)可以看到GDB已經(jīng)提示你了,這個(gè)core是由哪個(gè)程序產(chǎn)生的。 GDB 常用操作 上邊的程序比較簡(jiǎn)單,不需要另外的操作就能直接找到問(wèn)題所在?,F(xiàn)實(shí)卻不是這樣的,常常需要進(jìn)行單步跟蹤,設(shè)置斷點(diǎn)之類的操作才能順利定位問(wèn)題。下邊列出了GDB一些常用的操作。 啟動(dòng)程序:run設(shè)置斷點(diǎn):b 行號(hào)|函數(shù)名刪除斷點(diǎn):delete 斷點(diǎn)編號(hào)禁用斷點(diǎn):disable 斷點(diǎn)編號(hào)啟用斷點(diǎn):enable 斷點(diǎn)編號(hào)單步跟蹤:next 也可以簡(jiǎn)寫(xiě) n單步跟蹤:step 也可以簡(jiǎn)寫(xiě) s打印變量:print 變量名字設(shè)置變量:set var=value查看變量類型:ptype var順序執(zhí)行到結(jié)束:cont順序執(zhí)行到某一行: util lineno打印堆棧信息:btlinux 命令調(diào)試分析core文件的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux 命令調(diào)試分析core文件,Linux命令分析core文件以進(jìn)行調(diào)試,linux 下如何打開(kāi)core dump文件開(kāi)關(guān),如何查詢和修改Linux操作系統(tǒng)生成core dump文件的默認(rèn)路徑?,如何使用GDB調(diào)試Coredump文件的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級(jí)標(biāo)準(zhǔn)機(jī)房資源,具備完善的安防設(shè)施、三線及BGP網(wǎng)絡(luò)接入帶寬達(dá)10T,機(jī)柜接入千兆交換機(jī),能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運(yùn)行;創(chuàng)新互聯(lián)專注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認(rèn)可。
當(dāng)前題目:Linux命令分析core文件以進(jìn)行調(diào)試(linux命令調(diào)試分析core文件)
文章位置:http://m.5511xx.com/article/cciddjj.html


咨詢
建站咨詢
