日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linux命令分析core文件以進(jìn)行調(diào)試(linux命令調(diào)試分析core文件)

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

創(chuàng)新互聯(lián)建站是一家專業(yè)從事成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁設(shè)計的品牌網(wǎng)絡(luò)公司。如今是成都地區(qū)具影響力的網(wǎng)站設(shè)計公司,作為專業(yè)的成都網(wǎng)站建設(shè)公司,創(chuàng)新互聯(lián)建站依托強大的技術(shù)實力、以及多年的網(wǎng)站運營經(jīng)驗,為您提供專業(yè)的成都網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)及網(wǎng)站設(shè)計開發(fā)服務(wù)!

一、什么是core文件

在Linux系統(tǒng)中,當(dāng)一個進(jìn)程崩潰時,系統(tǒng)就會生成一個稱為core文件的文件。core文件包含了進(jìn)程崩潰時的內(nèi)存狀態(tài)、寄存器狀態(tài)、程序指針等信息,通常會非常的大(通常情況下都是進(jìn)程崩潰原因的關(guān)鍵提示)。這些信息都可以被用來定位問題的位置和原因。

二、如何生成core文件

要生成core文件,我們需要做兩件事情。我們需要確保系統(tǒng)在進(jìn)程崩潰時可以生成core文件。我們需要使用gdb來調(diào)試進(jìn)程,這樣我們才能夠使用gdb來分析core文件。

1.系統(tǒng)生成core文件的方式

我們可以通過ulimit命令來查看當(dāng)前系統(tǒng)允許生成core文件的大小,如果為0則表明系統(tǒng)不會生成core文件。

“`

$ ulimit -c

“`

我們可以通過修改/etc/security/limits.conf文件來確保系統(tǒng)對于某個用戶,允許生成core文件。

打開limits.conf文件,并添加以下兩行內(nèi)容:

“`

username soft core unlimited

username hard core unlimited

“`

其中,username表示用戶名,soft表示軟限制,hard表示硬限制,core表示core文件,unlimited表示無限制。添加完成后,保存并退出文件即可。此時我們可以通過以下命令來檢查修改是否生效:

“`

$ ulimit -a

“`

2.使用gdb調(diào)試進(jìn)程生成core文件

首先我們需要編譯程序時加入-g選項,這樣程序就會包含調(diào)試信息。

“`

$ gcc -g mn.c -o mn

“`

接著我們可以通過以下命令啟動gdb并附加到進(jìn)程中:

“`

$ gdb mn

(gdb) run

“`

等待程序運行并崩潰后,會收到以下提示:

“`

Program received signal SIGSEGV, Segmentation fault.

0x0000000000400537 in func ()

(gdb) bt

“`

此時我們可以通過輸入bt命令來查看調(diào)用堆棧。我們還可以通過設(shè)置core文件的大小來確保可以生成core文件。

“`

$ ulimit -c unlimited

“`

設(shè)置完成后再次運行程序,等待程序崩潰,此時我們就可以看到在程序運行所在目錄下會生成一個名為core的文件,這就是我們要分析的文件。

三、分析core文件

我們可以通過以下命令來分析core文件:

“`

$ gdb mn core

“`

其中,mn為程序的可執(zhí)行文件,core為要分析的core文件。運行完成后,命令行會提示:

“`

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 ()

“`

此時我們可以通過bt命令來查看調(diào)用堆棧:

“`

(gdb) bt

“`

除了可以查看調(diào)用堆棧外,我們還可以通過以下命令來查看代碼:

“`

(gdb) list

“`

同時,我們還可以通過以下命令來查看變量的值:

“`

(gdb) print variable

“`

我們可以通過以下命令來跳轉(zhuǎn)到某一行代碼:

“`

(gdb) jump line_number

“`

這樣,我們就可以通過分析core文件來定位程序崩潰的原因和位置。

Linux系統(tǒng)中,通過分析core文件來進(jìn)行調(diào)試可以說是非常方便、快速的一種調(diào)試方法,可以幫助我們快速定位程序的問題,快速解決問題。上面就是我在使用Linux系統(tǒng)時,通過的方法。希望本文對你有所幫助。

相關(guān)問題拓展閱讀:

  • linux 下如何打開core dump文件開關(guān)
  • 如何查詢和修改Linux操作系統(tǒng)生成core dump文件的默認(rèn)路徑?
  • 如何使用GDB調(diào)試Coredump文件

linux 下如何打開core dump文件開關(guān)

dump文件可以在程序crash時,方便我們查看程序crash的地方和上下文信息。在window下,要能生成dump文件,需要自己編寫相應(yīng)的代碼。不過現(xiàn)在網(wǎng)上可以找到相應(yīng)的代碼,只要把它下載后然后加到自己的工程中去,就可以了!

在linux下面就簡單的許多。只要打開相應(yīng)的開關(guān),linux會自動在程序crash時生成相應(yīng)的core文件。這個文件和window下的dump文件類似。

下面是簡單的一些步驟:

1.查看當(dāng)前是否已經(jīng)打開了此開關(guān)

通過命令:ulimit -c 如果輸出為 0

,則代表沒有打開。如果為unlimited則已經(jīng)打開了,就沒必要在做打開。

2.通過命令打開

ulimit -c unlimited .然后通過步驟1,可以監(jiān)測是否打開成功。

3.如果你要取消,很簡單:ulimit -c 0 就可以了

通過上面的命令修改后,一般都只是對當(dāng)前會話起作用,當(dāng)你下次重新登錄后,還是要重新輸入上面的命令,所以很麻煩。我們可以把通過修改

/etc/profile文件 來使系統(tǒng)每次自動打開。步驟如下:

1.首先打開/etc/profile文件

一般都可以在文件中找到 這句語句:ulimit -S -c 0 /dev/null

2&1.ok,根據(jù)上面的例子,我們只要把那個0 改為

unlimited 就ok了。然后保存退出。

2.通過source /etc/profile 使當(dāng)期設(shè)置生效。

3.通過ulimit -c 查看下是否已經(jīng)打開。

其實不光這個命令可以加入到/etc/profile文件中,一些其他我們需要每次登錄都生效的都可以加入到此文件中,因為登錄時linux都會加載此文件。比如一些環(huán)境變量的設(shè)置。

還有一種方法可以通過修改/etc/security/limits.conf文件來設(shè)置,這個方法沒有試過,也是網(wǎng)上看到。不過上面兩種就可以了!

最后說一下生成core

dump文件的位置,默認(rèn)位置與可執(zhí)行程序在同一目錄下,文件名是core.***,其中***是一個數(shù)字。core

dump文件名的模式保存在/proc/sys/kernel/core_pattern中,缺省值是core。通過以下命令可以更改core

dump文件的位置(如希望生成到/tmp/cores目錄下)

echo “/tmp/cores/core”

/proc/sys/kernel/core_pattern

設(shè)置完以后我們可以做個測試,寫個程序,產(chǎn)生一個異常。然后看到當(dāng)前目錄會有個core*的文件。然后我們可以

gdb core。* 程序 進(jìn)行調(diào)試。

如何查詢和修改Linux操作系統(tǒng)生成core dump文件的默認(rèn)路徑?

經(jīng)過分析發(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后并沒能生成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:臨時修改:修改/proc/sys/kernel/core_pattern文件,但/proc目錄本身是動態(tài)加載的,每次系統(tǒng)重啟都會重新加載,因此這種方法只能作為臨時修改。/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)時的系統(tǒng)狀態(tài),可通過以下參數(shù)來豐富core文件的命名:%% 單個%字符

如何使用GDB調(diào)試Coredump文件

一般這種情況都是因為數(shù)組越界訪問,空指針或是野指針讀寫造成的。程序小的話還比較好辦,對著源代碼仔細(xì)檢查就能解決。但是對于代碼量較大的程序,里邊包含N多函數(shù)調(diào)用,N多數(shù)組指針訪問,這時想定位問題就不是很容易了(此時牛人依然可以通過在適當(dāng)位置打printf加二分查找的方式迅速定位:P)。懶人的顫晌含話還是直接GDB搞起吧。 神馬是Core Dump文件偶爾就能聽見某程序員同學(xué)抱怨“擦,又出Core了!”。簡單來說,core dump說的是操作系統(tǒng)執(zhí)行的一個動作,當(dāng)某個進(jìn)程因為一些原因意外終止(crash)的時候,操作系統(tǒng)會將這個進(jìn)程當(dāng)時的內(nèi)存信息轉(zhuǎn)儲(dump)到磁盤上1。產(chǎn)生的文件就是core文件了,一般會以core.xxx形式命名。 如何產(chǎn)生Core Dump 發(fā)生doredump一般都是在進(jìn)程收到某個信號的時候,Linux上謹(jǐn)中現(xiàn)在大概有60多個信號,可以使用 kill -l 命令全部列出來。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針對特定的信號,應(yīng)用程序可以寫對應(yīng)的信號處理函數(shù)。如果不指定,則采取默認(rèn)的處理方式, 默認(rèn)處理是coredump的信號如下:3)SIGQUIT 4)SIGILL 6)SIGABRT 8)SIGFPE 11)SIGSEGV 7)SIGBUS 31)SIGSYS 5)SIGTRAP 24)SIGXCPU 25)SIGXFSZ 29)SIGIOT 我們看到SIGSEGV在其中,一般數(shù)組越界或是訪問空指針都會產(chǎn)生這個信號。另外雖然默認(rèn)是這樣的,但是你也可以寫自己的信號處理函數(shù)改變默認(rèn)行為,更多信號相關(guān)可以看參考茄笑鏈接33。 上述內(nèi)容只是產(chǎn)生coredump的必要條件,而非充分條件。要產(chǎn)生core文件還依賴于程序運行的shell,可以通過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,這個值用來限制產(chǎn)生的core文件大小,超過這個值就不會保存了。我這里輸出是0,也就是不會保存core文件,即使產(chǎn)生了,也保存不下來==! 要改變這個設(shè)置,可以使用ulimit -c unlimited。 OK, 現(xiàn)在萬事具備,只缺一個能產(chǎn)生Core的程序了,介個對C程序員來說太容易了。#include ; #include ; int crash() { char *xxx = “crash!!”; xxx = ‘D’; // 寫只讀存儲區(qū)! return 2; } int foo() { return crash(); } int main() { return foo(); } 上手調(diào)試 上邊的程序編譯的時候有一點需要注意,需要帶上參數(shù)-g, 這樣生成的可執(zhí)行程序中會帶上足夠的調(diào)試信息。編譯運行之后你就應(yīng)該能看見期待已久的“Segment Fault(core dumped)”或是“段錯誤 (核心已轉(zhuǎn)儲)”之類的字眼了??纯串?dāng)前目錄下是不是有個core或是core.xxx的文件。祭出linux下經(jīng)典的調(diào)試器GDB,首先帶著core文件載入程序:gdb exefile core,這里需要注意的這個core文件必須是exefile產(chǎn)生的,否則符號表會對不上。載入之后大概是這個樣子的: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行寫了一個只讀的內(nèi)存區(qū)域?qū)е掠|發(fā)Segment Fault信號。在載入core的時候有個小技巧,如果你事先不知道這個core文件是由哪個程序產(chǎn)生的,你可以先隨便找個代替一下,比如/usr/bin/w就是不錯的選擇。比如我們采用這種方法載入上邊產(chǎn)生的core,gdb會有類似的輸出: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)提示你了,這個core是由哪個程序產(chǎn)生的。 GDB 常用操作 上邊的程序比較簡單,不需要另外的操作就能直接找到問題所在?,F(xiàn)實卻不是這樣的,常常需要進(jìn)行單步跟蹤,設(shè)置斷點之類的操作才能順利定位問題。下邊列出了GDB一些常用的操作。 啟動程序:run設(shè)置斷點:b 行號|函數(shù)名刪除斷點:delete 斷點編號禁用斷點:disable 斷點編號啟用斷點:enable 斷點編號單步跟蹤:next 也可以簡寫 n單步跟蹤:step 也可以簡寫 s打印變量:print 變量名字設(shè)置變量:set var=value查看變量類型:ptype var順序執(zhí)行到結(jié)束:cont順序執(zhí)行到某一行: util lineno打印堆棧信息:btlinux 命令調(diào)試分析core文件的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux 命令調(diào)試分析core文件,Linux命令分析core文件以進(jìn)行調(diào)試,linux 下如何打開core dump文件開關(guān),如何查詢和修改Linux操作系統(tǒng)生成core dump文件的默認(rèn)路徑?,如何使用GDB調(diào)試Coredump文件的信息別忘了在本站進(jìn)行查找喔。

創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級標(biāo)準(zhǔn)機房資源,具備完善的安防設(shè)施、三線及BGP網(wǎng)絡(luò)接入帶寬達(dá)10T,機柜接入千兆交換機,能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運行;創(chuàng)新互聯(lián)專注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認(rèn)可。


分享文章:Linux命令分析core文件以進(jìn)行調(diào)試(linux命令調(diào)試分析core文件)
瀏覽地址:http://www.dlmjj.cn/article/cciddjj.html