学会用core dump调试程序错误
????? 在使用半導(dǎo)體作為內(nèi)存的材料前,人類(lèi)是利用線圈當(dāng)作內(nèi)存的材料(發(fā)明者為王安),線圈就叫作core ,用線圈做的內(nèi)存就叫作“corememory”。(線圈的單詞應(yīng)該是coil,呵呵)如今,半導(dǎo)體工業(yè)澎勃發(fā)展,已經(jīng)沒(méi)有人用線圈當(dāng)內(nèi)存了,不過(guò),在許多情況下,人們還是把內(nèi)存叫作“core”。所以注意了:這里的core不是核心,而是內(nèi)存。不過(guò)結(jié)合實(shí)際來(lái)看,好像也有點(diǎn)“內(nèi)核所占內(nèi)存”的意思。
????? core dump又是什么東東? 我們?cè)陂_(kāi)發(fā)(或使用)一個(gè)程序時(shí),最怕的就是程序莫明其妙地掛掉。雖然系統(tǒng)沒(méi)事,但我們下次仍可能遇到相同的問(wèn)題。于是,這時(shí)操作系統(tǒng)就會(huì)把程序掛掉時(shí)的內(nèi)存內(nèi)容寫(xiě)入一個(gè)叫做core的文件里(這個(gè)寫(xiě)入的動(dòng)作就叫dump,dump的英語(yǔ)意思是垃圾、傾倒。從這里來(lái)看,這些內(nèi)存的內(nèi)容是程序錯(cuò)誤運(yùn)行的結(jié)果,所以算是垃圾,把他弄出來(lái)就好比從大的內(nèi)存池里“傾倒”。),以便于我們調(diào)試。這個(gè)過(guò)程,因此叫做core dump。
1. 在嵌入式系統(tǒng)中,有時(shí)core dump直接從串口打印出來(lái),結(jié)合objdump查找ra和epa地址,運(yùn)用棧回溯,可以找到程序出錯(cuò)的地方。
2. 在一般Linux系統(tǒng)中,默認(rèn)是不會(huì)產(chǎn)生core dump文件的,通過(guò)ulimit -c來(lái)查看core dump文件的大小,一般開(kāi)始是0,可以設(shè)置core文件大小,ulimit -c 1024(kbytes單位)或者ulimit -c unlimited。
3. core dump文件輸出設(shè)置,一般默認(rèn)是當(dāng)前目錄,可以在/proc/sys/kernel中找到core-user-pid,通過(guò)
echo "1" > /proc/sys/kernel/core-user-pid使core文件名加上pid號(hào),還可以用
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 添加當(dāng)前uid
? ? %g - insert current gid into filename 添加當(dāng)前gid
? ? %s - insert signal that caused the coredump into the filename 添加導(dǎo)致產(chǎn)生core的信號(hào)
? ? %t - insert UNIX time that the coredump occurred into filename 添加core文件生成時(shí)的unix時(shí)間
? ? %h - insert hostname where the coredump happened into filename 添加主機(jī)名
? ? %e - insert coredumping executable name into filename 添加命令名
4. 用gdb查看core文件:
下面我們可以在發(fā)生運(yùn)行時(shí)信號(hào)引起的錯(cuò)誤時(shí)發(fā)生core dump了.編譯時(shí)加上-g
發(fā)生core dump之后, 用gdb進(jìn)行查看core文件的內(nèi)容, 以定位文件中引發(fā)core dump的行.
gdb [exec file] [core file]
如:
gdb ./test test.core
在進(jìn)入gdb后, 用bt命令查看backtrace以檢查發(fā)生程序運(yùn)行到哪里, 來(lái)定位core dump的文件行.
5. 給個(gè)例子
test.c
?
void a()
{
?? char *p = NULL;
?? printf("%d/n", *p);
}
?
int main()
{
??? a();
??? return 0;
}
?
編譯 gcc -g -o test test.c
運(yùn)行 ./test
報(bào)segmentation fault(core dump)
gdb ./test test.core如果生成的是test.core.
?
?
總結(jié)
以上是生活随笔為你收集整理的学会用core dump调试程序错误的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: addr2line探秘(没有core怎么
- 下一篇: 网络编程--Address alread