新聞中心
linux coredump是Linux操作系統(tǒng)中的一個(gè)非常重要的特性,它為我們?cè)谡{(diào)試程序時(shí)提供了非常有用的工具。本文將從原理和應(yīng)用兩個(gè)方面來(lái)解析Linux Coredump。

一、Coredump的原理
Coredump是一種操作系統(tǒng)級(jí)別的機(jī)制,它允許程序在運(yùn)行過(guò)程中遇到錯(cuò)誤時(shí),將當(dāng)前進(jìn)程中的所有信息,包括程序代碼、運(yùn)行狀態(tài)、內(nèi)存空間、線程調(diào)用棧等,打印到一個(gè)特殊的文件中,從而方便我們?cè)诤罄m(xù)的調(diào)試中進(jìn)行分析和定位問(wèn)題。
具體來(lái)說(shuō),Coredump的原理可以概括為以下幾個(gè)步驟:
1.程序出現(xiàn)問(wèn)題,操作系統(tǒng)接收到異常信號(hào)
2.操作系統(tǒng)通知程序執(zhí)行Coredump操作
3.程序?qū)?dāng)前進(jìn)程信息寫(xiě)入指定文件中
4.操作系統(tǒng)回調(diào)程序繼續(xù)運(yùn)行
在Linux中,Coredump通常由操作系統(tǒng)內(nèi)核實(shí)現(xiàn),具體而言,是由內(nèi)核模塊”crash_dump”和”sysctl_writers”控制的。當(dāng)程序出現(xiàn)需要生成Coredump文件的異常信號(hào)時(shí),內(nèi)核模塊crash_dump就會(huì)將進(jìn)程的關(guān)鍵信息存儲(chǔ)到內(nèi)存中,并通過(guò)sysctl_writers模塊,將這些信息寫(xiě)入指定位置的文件中。
二、Coredump的應(yīng)用
Coredump作為一個(gè)非常重要的工具,主要用于程序開(kāi)發(fā)和調(diào)試中。在真實(shí)的生產(chǎn)環(huán)境中,程序可能會(huì)面臨各種不同的挑戰(zhàn),比如內(nèi)存泄露、死鎖、文件讀寫(xiě)異常等等,這些問(wèn)題可能會(huì)導(dǎo)致程序崩潰或者無(wú)法正常運(yùn)行。此時(shí),Coredump就可以發(fā)揮重要作用。
Coredump可以提供程序崩潰時(shí)的詳細(xì)信息,幫助開(kāi)發(fā)者分析程序運(yùn)行狀態(tài),發(fā)現(xiàn)問(wèn)題并及時(shí)解決。具體而言,Coredump可以提供以下方面的信息:
1.程序在出現(xiàn)異常之前的代碼執(zhí)行情況
2.程序崩潰時(shí)的堆棧調(diào)用信息
3.程序中涉及到的內(nèi)存地址和存儲(chǔ)空間
4.程序打開(kāi)的文件信息和網(wǎng)絡(luò)連接信息等等
基于這些信息,開(kāi)發(fā)者可以很容易地找到程序的問(wèn)題所在,并進(jìn)行針對(duì)性的優(yōu)化和修復(fù)。
除了調(diào)試外,Coredump還可以用于安全或者法律方面的審計(jì)。對(duì)于一些需要高度安全的系統(tǒng),如果涉及到黑客攻擊等非正常事件,Coredump可以記錄事件發(fā)生時(shí)的系統(tǒng)狀態(tài),以供后續(xù)的事件調(diào)查和分析。同時(shí),Coredump也可以遵循相關(guān)規(guī)定,形成法律證據(jù)以供司法機(jī)關(guān)使用。
三、Coredump的注意事項(xiàng)
雖然Coredump是非常有用的工具,但是在使用時(shí)也需要注意一些問(wèn)題。具體而言,需要注意以下幾點(diǎn):
1. Coredump可能會(huì)泄漏敏感信息:Coredump會(huì)記錄當(dāng)前進(jìn)程的全部狀態(tài),包括內(nèi)存信息、文件信息等。如果進(jìn)程中涉及到敏感信息,比如密碼、證書(shū)等等,都可能被記錄和泄漏,因此需要特別注意。
2. Coredump耗費(fèi)時(shí)間和資源:由于Coredump需要遍歷整個(gè)進(jìn)程空間,并將相關(guān)信息寫(xiě)入文件中,因此會(huì)對(duì)系統(tǒng)資源造成一定的消耗,包括CPU、內(nèi)存等等。如果Coredump頻繁觸發(fā),可能會(huì)對(duì)系統(tǒng)性能帶來(lái)負(fù)面影響。
3. Coredump需要適當(dāng)限制大?。河捎贑oredump會(huì)記錄全部信息,因此生成的文件可能會(huì)非常大,特別是在一些內(nèi)存占用比較大的應(yīng)用程序中。如果不加限制,可能會(huì)導(dǎo)致系統(tǒng)崩潰或者磁盤(pán)空間被耗盡,因此需要設(shè)置適當(dāng)?shù)南拗啤?/p>
四、
Coredump作為L(zhǎng)inux系統(tǒng)中的一個(gè)非常重要的特性,為我們?cè)诔绦蜷_(kāi)發(fā)和調(diào)試中提供了非常有用的工具。通過(guò)了解Coredump的原理和應(yīng)用,我們可以更好地理解它的作用和使用方法,進(jìn)而為程序開(kāi)發(fā)和運(yùn)維工作提供更好的支持。需要注意的是,在使用Coredump時(shí)需要謹(jǐn)慎,以避免出現(xiàn)不必要的問(wèn)題。
相關(guān)問(wèn)題拓展閱讀:
- 如何使用GDB調(diào)試Coredump文件
- linux服務(wù)器端崩潰,有core文件信息,崩潰前我的最后一句代碼是vector::clear()
如何使用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打印堆棧信息:bt
linux服務(wù)器端崩潰,有core文件信息,崩潰前我的最后一句代碼是vector::clear()
這種錯(cuò)誤,你有代碼和coredump,都找不到問(wèn)題了,別人怎么搞。
應(yīng)該是內(nèi)存相關(guān)的問(wèn)題,對(duì)象已經(jīng)釋放了之類的。
你在gdb , frame 1 , frame 6等等,跳到對(duì)應(yīng)的調(diào)用棧上去。檢查T(mén)Cards , vector這種對(duì)象的指針是不是還是有效的?
到底什么原因?qū)е碌倪@個(gè)core dump。你空橘歲這個(gè)應(yīng)該是游戲代碼,用戶離開(kāi)的時(shí)候觸發(fā)的這個(gè)bug。全部相伍遲關(guān)的邏輯代斗睜碼都要檢查一下吧,看看是不是哪里導(dǎo)致 某個(gè)類的對(duì)象被銷毀了多次之類的。
linux coredump的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux coredump,關(guān)于Linux Coredump的原理和應(yīng)用解析,如何使用GDB調(diào)試Coredump文件,linux服務(wù)器端崩潰,有core文件信息,崩潰前我的最后一句代碼是vector::clear()的信息別忘了在本站進(jìn)行查找喔。
成都服務(wù)器托管選創(chuàng)新互聯(lián),先上架開(kāi)通再付費(fèi)。
創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)-網(wǎng)站建設(shè),軟件開(kāi)發(fā)老牌服務(wù)商!微信小程序開(kāi)發(fā),APP開(kāi)發(fā),網(wǎng)站制作,網(wǎng)站營(yíng)銷推廣服務(wù)眾多企業(yè)。電話:028-86922220
當(dāng)前名稱:關(guān)于Linux Coredump的原理和應(yīng)用解析 (linux coredump)
路徑分享:http://fisionsoft.com.cn/article/cdjhphh.html


咨詢
建站咨詢
