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 参数。