1. 在嵌入式系統(tǒng)中,有時core dump直接從串口打印出來,結合objdump查找ra和epa地址,運用棧回溯,可以找到程序出錯的地方。
2. 在一般Linux系統(tǒng)中,默認是不會產(chǎn)生core dump文件的,通過ulimit -c來查看core dump文件的大小,一般開始是0,可以設置core文件大小,ulimit -c 1024(kbytes單位)或者ulimit -c unlimited。
3. core dump文件輸出設置,一般默認是當前目錄,可以在/proc/sys/kernel中找到core-user-pid,通過
echo "1" > /proc/sys/kernel/core-user-pid使core文件名加上pid號,還可以用
mkdir -p /root/corefile
echo "/root/corefile/core-%e-%p-%t" > /proc/sys/kernel/core-pattern控制core文件保存位置和文件名格式。
以下是參數(shù)列表:
%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 添加導致產(chǎn)生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 添加命令名
4. 用gdb查看core文件:
下面我們可以在發(fā)生運行時信號引起的錯誤時發(fā)生core dump了.編譯時加上-g
發(fā)生core dump之后, 用gdb進行查看core文件的內(nèi)容, 以定位文件中引發(fā)core dump的行.
gdb [exec file] [core file]
如:
gdb ./test test.core
在進入gdb后, 用bt命令查看backtrace以檢查發(fā)生程序運行到哪里, 來定位core dump的文件行.
5. 給個例子
test.c
void a()
{
char *p = NULL;
printf("%d/n", *p);
}
int main()
{
a();
return 0;
}
編譯 gcc -g -o test test.c
運行 ./test
報segmentation fault(core dump)
gdb ./test test.core如果生成的是test.core.
開發(fā)過程中,當一個Linux程序異常退出時,我們可以通過core文件來分析它異常的詳細原因。缺省情況下,Linux在程序異常時不產(chǎn)生core文件,要想讓程序異常退出時產(chǎn)生core dump文件,需要使用ulimit命令更改coredump的設置:
ulimit -c unlimited
上面的命令表示在程序異常時產(chǎn)生core dump文件,并且不對core dump文件的大小進行限制。
上述設置只是使能了core dump功能,缺省情況下,內(nèi)核在coredump時所產(chǎn)生的core文件放在與該程序相同的目錄中,并且文件名固定為core。很顯然,如果有多個程序產(chǎn)生core文件,或者同一個程序多次崩潰,就會重復覆蓋同一個core文件。
我們通過修改kernel的參數(shù),可以指定內(nèi)核所生成的coredump文件的文件名。例如,Easwy使用下面的命令使kernel生成名字為core.filename.pid格式的core dump文件:
echo 'core.%e.%p' > /proc/sys/kernel/core_pattern
這樣配置后,產(chǎn)生的core文件中將帶有崩潰的程序名、以及它的進程ID。上面的%e和%p會被替換成程序文件名以及進程ID。
可以在core_pattern模板中使用變量還很多,見下面的列表:
如果在上述文件名中包含目錄分隔符”/“,那么所生成的core文件將會被放到指定的目錄中。
需要說明的是,在內(nèi)核中還有一個與coredump相關的設置,就是/proc/sys/kernel/core_uses_pid。如果這個文件的內(nèi)容被配置成1,那么即使core_pattern中沒有設置%p,最后生成的core dump文件名仍會加上進程ID。
對所生成的core dump進程分析,需要使用調(diào)試工具,例如GDB等??梢詤⒁?a class="link" target="_top" style="color: rgb(68, 161, 208); text-decoration: none; ">Easwy的其它文章。
原創(chuàng)文章,請閱讀頁腳的許可方式,轉(zhuǎn)載請注明:轉(zhuǎn)載自易水博客 [ http://easwy.com/blog/ ]
http://blog.163.com/chujb_chen/blog/static/10571112011410112118895/
2011-05-10 11:21:18| 分類: 精品轉(zhuǎn)載|字號 訂閱
問題:1. 生成的core dump保存路徑在哪里,怎么設置
==============================================
default it 's in the initial directory of your running the program
問題2.我的多線程程序在通過socket 連接同其它進程通訊,在對方進程退出或shutdown 時也幾乎同時退出。可是我的程序沒有輸出任何在程序正常退出時肯定會顯示的提示信息而直接退出,也沒有產(chǎn)生 core dump 文件,不知道這是什么原因。 請問哪位知道: 進程異常退出時 Unix 在什么情況下會不產(chǎn)生 core dump 文件?
產(chǎn)生 core dump 文件,一般是程序異常中止(堆棧返回錯誤,內(nèi)存訪問出錯...)
是否產(chǎn)成core dump文件,程序可以控制,產(chǎn)生的core dump文件的大小,程序也可以控制,命令也可設置;
需要root權限;
the signal "SIGPIPE " ended your program.
我只知道有兩種可能
一種是產(chǎn)生core的一個信號被忽略了,進程收到信號就直接退出。
另一種是文件可以產(chǎn)生,但沒法寫到硬盤上,空間不夠,沒有權限等等原因。
很多信號默認的處理就是退出
初學者大部分的原因都是訪問了不該訪問的內(nèi)存,這里面絕大多數(shù)又是因為訪問零地址或內(nèi)存溢出
聯(lián)系客服