轉自:https://blog.csdn.net/dingqinghui/article/details/77855330?locationNum=9&fps=1
程序異常退出時,內核會生成一個core文件(是內存映像以及調試信息)。可以通過使用gdb來查看core文件,指示出導致程序出錯的代碼所在的文件和行數。
1、查看系統中core文件生成的開關是否打開
1)使用ulimit -c命令可查看core文件的生成開關,若結果為0,則便是關閉了此功能,不會生成core文件。
2、設置core文件生成
1)使用命令ulimit -c filesize命令
若ulimit -c unlimited 則標識此core文件的大小不受限制
若指定filesize,如果生成的信息超過此大小,將會被裁剪,最終生成一個不完整的core文件,在調
試此core文件時,gdb會提示錯誤。
2)但是若想整個系統中生效則在shell里面設置是不行的,方法如下:
(1)編輯/root/.bash_profile文件,在其中加入ulitmit -S -c unlimited
(2)source /root/.bash_profile
3、core文件的設置
1)/proc/sys/kernel/core_uses_pid可以控制core文件的問價名是否添加PID作為擴展,文件的內容為1,
標識添加PID作為擴展,生成的core文件格式為core.XXXX;為0則表示生成的core文件統一命名為
core;可通過一下命令修改此文件:
echo "1" > /proc/sys/kernel/core_uses_pid
2)core文件的保存位置和文件名格式
echo "/corefile/core-%e-%p-%t" > core_pattern,可以將core文件統一生成到/corefile目錄
下,產生的文件名為core-命令名-pid-時間戳
以下是參數列表:
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加當前uid
%g - insert current gid into filename 添加當前gid
%s - insert signal that caused the coredump into the filename 添加導致產生core的信號
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成的unix時間
%h - insert hostname where the coredump happened into filename 添加主機名
%e - insert coredumping executable name into filename 添加命令名
3.core文件的查看
core文件需要使用gdb來查看。
gdb ./a.out
core-file core.xxxx
使用bt命令即可看到程序出錯的地方。
以下兩種命令方式具有相同的效果,但是在有些環境下不生效,所以推薦使用上面的命令。
1)gdb -core=core.xxxx
file ./a.out
bt
2)gdb -c core.xxxx
file ./a.out
bt
也可以通過gdb 程序名 core文件名
如:gdb test core.8482
然后通過bt或者where查看程序崩潰時的堆棧信息
注意:在編譯程序的時候要加入選項-g。
在linux環境下調試多線程,總覺得不像.NET那么方便。這幾天就為找一個死鎖的bug折騰好久,介紹一下用過的方法吧。
多線程如果dump,多為段錯誤,一般都涉及內存非法讀寫。可以這樣處理,使用下面的命令打開系統開關,讓其可以在死掉的時候生成core文件。
ulimit -c unlimited
這樣的話死掉的時候就可以在當前目錄看到core.pid(pid為進程號)的文件。接着使用gdb:
gdb ./bin ./core.pid
進去后,使用bt查看死掉時棧的情況,在使用frame命令。
還有就是里面某個線程停住,也沒死,這種情況一般就是死鎖或者涉及消息接受的超時問題(聽人說的,沒有遇到過)。遇到這種情況,可以使用:
gcore pid(調試進程的pid號)
手動生成core文件,在使用pstack(linux下好像不好使)查看堆棧的情況。如果都看不出來,就仔細查看代碼,看看是不是在if,return,break,continue這種語句操作是忘記解鎖,還有嵌套鎖的問題,都需要分析清楚了。
最后,說一句,靜心看代碼,捶胸頓足是沒有用的。
---------------------------------------------------------------
使用C/C++語言開發程序時,當程序crash的時候產生core dump文件對於調試程序是很有幫助的。在Redhat Linux系統中默認是不生成core dump文件的,這是因為在/etc/profile文件中有這樣一行
ulimit -S -c 0 > /dev/null 2>&1
如何打開core dump呢?最簡單的方法是用戶在自己的~/.bash_profile中加入ulimit -S -c unlimited > /dev/null 2>&1,這樣設置后允許當前用戶生成沒有大小限制的core dump文件。此外還有兩種系統級修改生成core dump的方法。
第一種方法是修改/etc/profile,把ulimit那一行改為
ulimit -S -c unlimited > /dev/null 2>&1
這樣設置后系統允許所有用戶生成沒有大小限制的core dump文件。這樣做的優點是不需要重起系統,缺點是無法控制只讓某些用戶生成core dump文件。
第二種方法是修改/etc/security/limits.conf文件。很多系統上限都可以通過修改這個文件改變,如最大子進程個數,最大打開文件數等等。這個文件有詳細的注釋,對如何修改這個文件做了說明。如果想對所有用戶打開core dump,可以加入一行
* soft core 0
如果只想對某些用戶或用戶組打開core dump,可以加入
user soft core 0或@group soft core 0
注意如果通過修改/etc/security/limits.conf文件打開core dump,還需要注釋掉/etc/profile中的ulmit那一行
#ulimit -S -c 0 > /dev/null 2>&1
這樣修改的優點是可以針對特定用戶或特定組打開core dump文件,缺點是需要重起系統。
最后說一下生成core dump文件的位置,默認位置與可執行程序在同一目錄下,文件名是core.***,其中***是一個數字。core dump文件名的模式保存在/proc/sys/kernel/core_pattern中,缺省值是core。通過以下命令可以更改core dump文件的位置(如希望生成到/tmp/cores目錄下)
echo "/tmp/cores/core" > /proc/sys/kernel/core_pattern
