linuxgdbcore
『壹』 怎麼查看linux的core開關,以及如何打開和關閉
mp文件可以在程序crash時,方便我們查看程序crash的地方和上下文信息。在window下,要能生成mp文件,需要自己編寫相應的代碼。不過現在網上可以找到相應的代碼,只要把它下載後然後加到自己的工程中去,就可以了!在linux下面就簡單的許多。只要打開相應的開關,linux會自動在程序crash時生成相應的core文件。這個文件和window下的mp文件類似。
下面是簡單的一些步驟:
1.查看當前是否已經打開了此開關
通過命令:ulimit -c 如果輸出為 0
,則代表沒有打開。如果為unlimited則已經打開了,就沒必要在做打開。
2.通過命令打開
ulimit -c unlimited .然後通過步驟1,可以監測是否打開成功。
3.如果你要取消,很簡單:ulimit -c 0 就可以了
通過上面的命令修改後,一般都只是對當前會話起作用,當你下次重新登錄後,還是要重新輸入上面的命令,所以很麻煩。我們可以把通過修改
/etc/profile文件 來使系統每次自動打開。步驟如下:
1.首先打開/etc/profile文件
一般都可以在文件中找到 這句語句:ulimit -S -c 0 /dev/null
2&1.ok,根據上面的例子,我們只要把那個0 改為
unlimited 就ok了。然後保存退出。
2.通過source /etc/profile 使當期設置生效。
3.通過ulimit -c 查看下是否已經打開。
其實不光這個命令可以加入到/etc/profile文件中,一些其他我們需要每次登錄都生效的都可以加入到此文件中,因為登錄時linux都會載入此文件。比如一些環境變數的設置。
還有一種方法可以通過修改/etc/security/limits.conf文件來設置,這個方法沒有試過,也是網上看到。不過上面兩種就可以了!
最後說一下生成core
mp文件的位置,默認位置與可執行程序在同一目錄下,文件名是core.***,其中***是一個數字。core
mp文件名的模式保存在/proc/sys/kernel/core_pattern中,預設值是core。通過以下命令可以更改core
mp文件的位置(如希望生成到/tmp/cores目錄下)
echo 「/tmp/cores/core」
/proc/sys/kernel/core_pattern
設置完以後我們可以做個測試,寫個程序,產生一個異常。然後看到當前目錄會有個core*的文件。然後我們可以
gdb core。* 程序 進行調試。
『貳』 linux core 怎麼打開
core文件是由應用程序收到系統信號後崩潰產生的,該文件中記錄了程序崩潰的原因(例如收到那種信號),調用堆棧和崩潰時的內存及變數值等等的信息。
打開core文件與編譯時使用的編譯器有關,但絕大多數linux程序是使用gcc編譯器編譯的,因此可使用對應gdb調試器打開,命令格式如下:
$ gdb 應用程序文件名 core文件名
舉例:
$ gdb /usr/bin/gedit ~/core ------ 查看由gedit崩潰產生的core文件
(gdb) bt ------ 或者backtrace, 查看程序運行到當前位置之前所有的堆棧幀情況)
(gdb) quit ------ 退出
如果不知道core文件由哪個文件產生的,可使用file命令顯示
$ file core
『叄』 1 linux下調試core的命令,察看堆棧狀態命令
比方說,你要調試的core文件是 core.xxx,原始可執行文件是 a.exe
先用 gdb a.exe 進入 gdb,在gdb命令行下 執行
core-file /path/to/core.xxx
然後即可調試core mp文件了,比如用 bt 等
『肆』 涓哄暐gdb core鏂囦歡鐨勬椂鍊欐棤娉曞畾浣嶅嚭鍑洪棶棰樼殑鍦版柟
涓鑸榪欑嶆儏鍐甸兘鏄鍥犱負鏁扮粍瓚婄晫璁塊棶錛岀┖鎸囬拡鎴栨槸閲庢寚閽堣誨啓閫犳垚鐨勩傜▼搴忓皬鐨勮瘽榪樻瘮杈冨ソ鍔烇紝瀵圭潃婧愪唬鐮佷粩緇嗘鏌ュ氨鑳借В鍐熾備絾鏄瀵逛簬浠g爜閲忚緝澶х殑紼嬪簭錛岄噷杈瑰寘鍚玁澶氬嚱鏁拌皟鐢錛孨澶氭暟緇勬寚閽堣塊棶錛岃繖鏃舵兂瀹氫綅闂棰樺氨涓嶆槸寰堝規槗浜(姝ゆ椂鐗涗漢渚濈劧鍙浠ラ氳繃鍦ㄩ傚綋浣嶇疆鎵損rintf鍔犱簩鍒嗘煡鎵劇殑鏂瑰紡榪呴熷畾浣:P)銆傛噿浜虹殑璇濊繕鏄鐩存帴GDB鎼炶搗鍚с 紲為┈鏄疌ore Dump鏂囦歡鍋跺皵灝辮兘鍚瑙佹煇紼嬪簭鍛樺悓瀛︽姳鎬ㄢ滄摝錛屽張鍑篊ore浜!鈥濄傜畝鍗曟潵璇達紝core mp璇寸殑鏄鎿嶄綔緋葷粺鎵ц岀殑涓涓鍔ㄤ綔錛屽綋鏌愪釜榪涚▼鍥犱負涓浜涘師鍥犳剰澶栫粓姝(crash)鐨勬椂鍊欙紝鎿嶄綔緋葷粺浼氬皢榪欎釜榪涚▼褰撴椂鐨勫唴瀛樹俊鎮杞鍌(mp)鍒扮佺洏涓1銆備駭鐢熺殑鏂囦歡灝辨槸core鏂囦歡浜嗭紝涓鑸浼氫互core.xxx褰㈠紡鍛藉悕銆 濡備綍浜х敓Core Dump 鍙戠敓doremp涓鑸閮芥槸鍦ㄨ繘紼嬫敹鍒版煇涓淇″彿鐨勬椂鍊欙紝Linux涓婄幇鍦ㄥぇ姒傛湁60澶氫釜淇″彿錛屽彲浠ヤ嬌鐢 kill -l 鍛戒護鍏ㄩ儴鍒楀嚭鏉ャ俿agi@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閽堝圭壒瀹氱殑淇″彿錛屽簲鐢ㄧ▼搴忓彲浠ュ啓瀵瑰簲鐨勪俊鍙峰勭悊鍑芥暟銆傚傛灉涓嶆寚瀹氾紝鍒欓噰鍙栭粯璁ょ殑澶勭悊鏂瑰紡, 榛樿ゅ勭悊鏄痗oremp鐨勪俊鍙峰備笅:3)SIGQUIT 4)SIGILL 6)SIGABRT 8)SIGFPE 11)SIGSEGV 7)SIGBUS 31)SIGSYS 5)SIGTRAP 24)SIGXCPU 25)SIGXFSZ 29)SIGIOT 鎴戜滑鐪嬪埌SIGSEGV鍦ㄥ叾涓錛屼竴鑸鏁扮粍瓚婄晫鎴栨槸璁塊棶絀烘寚閽堥兘浼氫駭鐢熻繖涓淇″彿銆傚彟澶栬櫧鐒墮粯璁ゆ槸榪欐牱鐨勶紝浣嗘槸浣犱篃鍙浠ュ啓鑷宸辯殑淇″彿澶勭悊鍑芥暟鏀瑰彉榛樿よ屼負錛屾洿澶氫俊鍙風浉鍏沖彲浠ョ湅鍙傝冮摼鎺33銆 涓婅堪鍐呭瑰彧鏄浜х敓coremp鐨勫繀瑕佹潯浠訛紝鑰岄潪鍏呭垎鏉′歡銆傝佷駭鐢焎ore鏂囦歡榪樹緷璧栦簬紼嬪簭榪愯岀殑shell錛屽彲浠ラ氳繃ulimit -a鍛戒護鏌ョ湅錛岃緭鍑哄唴瀹瑰ぇ鑷村備笅:sagi@sagi-laptop:~$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheling priority (-e) 20 file size (blocks, -f) unlimited pending signals (-i) 16382 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) 819200 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錛岃繖涓鍊肩敤鏉ラ檺鍒朵駭鐢熺殑core鏂囦歡澶у皬錛岃秴榪囪繖涓鍊煎氨涓嶄細淇濆瓨浜嗐傛垜榪欓噷杈撳嚭鏄0錛屼篃灝辨槸涓嶄細淇濆瓨core鏂囦歡錛屽嵆浣誇駭鐢熶簡錛屼篃淇濆瓨涓嶄笅鏉==! 瑕佹敼鍙樿繖涓璁劇疆錛屽彲浠ヤ嬌鐢╱limit -c unlimited銆 OK, 鐜板湪涓囦簨鍏峰囷紝鍙緙轟竴涓鑳戒駭鐢烠ore鐨勭▼搴忎簡錛屼粙涓瀵笴紼嬪簭鍛樻潵璇村お瀹規槗浜嗐#include <stdio.h>; #include <stdlib.h>; int crash() { char *xxx = "crash!!"; xxx[1] = 'D'; // 鍐欏彧璇誨瓨鍌ㄥ尯! return 2; } int foo() { return crash(); } int main() { return foo(); } 涓婃墜璋冭瘯 涓婅竟鐨勭▼搴忕紪璇戠殑鏃跺欐湁涓鐐歸渶瑕佹敞鎰忥紝闇瑕佸甫涓婂弬鏁-g, 榪欐牱鐢熸垚鐨勫彲鎵ц岀▼搴忎腑浼氬甫涓婅凍澶熺殑璋冭瘯淇℃伅銆傜紪璇戣繍琛屼箣鍚庝綘灝卞簲璇ヨ兘鐪嬭佹湡寰呭凡涔呯殑鈥淪egment Fault(core mped)鈥濇垨鏄鈥滄甸敊璇 (鏍稿績宸茶漿鍌)鈥濅箣綾葷殑瀛楃溂浜嗐傜湅鐪嬪綋鍓嶇洰褰曚笅鏄涓嶆槸鏈変釜core鎴栨槸core.xxx鐨勬枃浠躲傜キ鍑簂inux涓嬬粡鍏哥殑璋冭瘯鍣℅DB錛岄栧厛甯︾潃core鏂囦歡杞藉叆紼嬪簭:gdb exefile core錛岃繖閲岄渶瑕佹敞鎰忕殑榪欎釜core鏂囦歡蹇呴』鏄痚xefile浜х敓鐨勶紝鍚﹀垯絎﹀彿琛ㄤ細瀵逛笉涓娿傝澆鍏ヤ箣鍚庡ぇ姒傛槸榪欎釜鏍峰瓙鐨:sagi@sagi-laptop:~$ gdb coremp core Core was generated by ./coremp'. Program terminated with signal 11, Segmentation fault. #0 0x080483a7 in crash () at coremp.c:8 8 xxx[1] = 'D'; (gdb)鎴戜滑鐪嬪埌宸茬粡鑳界洿鎺ュ畾浣嶅埌鍑篶ore鐨勫湴鏂逛簡錛屽湪絎8琛屽啓浜嗕竴涓鍙璇葷殑鍐呭瓨鍖哄煙瀵艱嚧瑙﹀彂Segment Fault淇″彿銆傚湪杞藉叆core鐨勬椂鍊欐湁涓灝忔妧宸э紝濡傛灉浣犱簨鍏堜笉鐭ラ亾榪欎釜core鏂囦歡鏄鐢卞摢涓紼嬪簭浜х敓鐨勶紝浣犲彲浠ュ厛闅忎究鎵句釜浠f浛涓涓嬶紝姣斿/usr/bin/w灝辨槸涓嶉敊鐨勯夋嫨銆傛瘮濡傛垜浠閲囩敤榪欑嶆柟娉曡澆鍏ヤ笂杈逛駭鐢熺殑core錛実db浼氭湁綾諱技鐨勮緭鍑:sagi@sagi-laptop:~$ gdb /usr/bin/w core Core was generated by ./coremp'. Program terminated with signal 11, Segmentation fault. #0 0x080483a7 in ? () (gdb)鍙浠ョ湅鍒癎DB宸茬粡鎻愮ず浣犱簡錛岃繖涓猚ore鏄鐢卞摢涓紼嬪簭浜х敓鐨勩 GDB 甯哥敤鎿嶄綔 涓婅竟鐨勭▼搴忔瘮杈冪畝鍗曪紝涓嶉渶瑕佸彟澶栫殑鎿嶄綔灝辮兘鐩存帴鎵懼埌闂棰樻墍鍦ㄣ傜幇瀹炲嵈涓嶆槸榪欐牱鐨勶紝甯稿父闇瑕佽繘琛屽崟姝ヨ窡韙錛岃劇疆鏂鐐逛箣綾葷殑鎿嶄綔鎵嶈兘欏哄埄瀹氫綅闂棰樸備笅杈瑰垪鍑轟簡GDB涓浜涘父鐢ㄧ殑鎿嶄綔銆 鍚鍔ㄧ▼搴:run 璁劇疆鏂鐐:b 琛屽彿鍑芥暟鍚 鍒犻櫎鏂鐐:delete 鏂鐐圭紪鍙 紱佺敤鏂鐐:disable 鏂鐐圭紪鍙 鍚鐢ㄦ柇鐐:enable 鏂鐐圭紪鍙 鍗曟ヨ窡韙:next 涔熷彲浠ョ畝鍐 n 鍗曟ヨ窡韙:step 涔熷彲浠ョ畝鍐 s 鎵撳嵃鍙橀噺:print 鍙橀噺鍚嶅瓧 璁劇疆鍙橀噺:set var=value 鏌ョ湅鍙橀噺綾誨瀷:ptype var 欏哄簭鎵ц屽埌緇撴潫:cont 欏哄簭鎵ц屽埌鏌愪竴琛: util lineno鎵撳嵃鍫嗘爤淇℃伅:bt
『伍』 誰能告訴我linux下出core,core究竟是什麼
就是一個程序出錯時,相關的調試信息,生成的一個文件。
可以對它調試,得到出錯原因。
用gdb就可以了。但你的程序必須帶gdb信息。
也就是說,在編譯的時候要指定-g 參數。