在UNIX下調(diào)試程序,如果遇到內(nèi)存溢出等問題的時候,經(jīng)常在當(dāng)前目錄下出現(xiàn)這樣一個文件:core
用指令>ls –l 可以發(fā)現(xiàn),core是一個很大的文件,動輒上百M,很是耗費(fèi)硬盤空間,所以一般我們都會及時將它清除掉,從而很少去關(guān)注它的真正內(nèi)涵。其實(shí)core中放置的是執(zhí)行進(jìn)程的內(nèi)存映像,其中的提示信息core dump就是信息轉(zhuǎn)儲的意思,在調(diào)試一個有問題的程序時它經(jīng)常是很起作用的。下面我們就來探討一下,如何有效的利用這個core文件來調(diào)試我們的代碼。
1.例如調(diào)試程序一段名為samp.c 的程序,如下進(jìn)行調(diào)試
$ cc -g samp.c -o samp
$ samp
當(dāng)程序在運(yùn)行的時候出現(xiàn)一個
Bus Error - core dumped
的提示,現(xiàn)在core生成了,為了獲得錯誤出現(xiàn)的位置,輸入
$ dbx samp
然后我們會得到以下提示
Type 'help' for help.
reading symbolic information ... reading symbolic information . . . [
using memory image in core]
25 x[i] = 0;
(dbx) quit
2.下面這個例子將要闡述怎么用dbx聯(lián)系進(jìn)程,程序如下:
/***********
* looper.c: *
************/
main()
{
int i,x[10];
for (i = 0; i < 10;);
}
很顯然這是一個死循環(huán)程序,先編譯
$ cc -g looper.c -o looper
$ looper
當(dāng)程序運(yùn)行時,在另一個打開的窗口里用指令 ps -u UserID 獲得進(jìn)程looper的ID,
PID TTY TIME COMMAND
68 console 0:04 sh
467 lft3 10:48 looper
從而得到進(jìn)程的ID 467, 下面執(zhí)行dbx
$ dbx -a 467
Waiting to attach to process 467...
Successfully attached to looper
Type 'help' for help.
reading symbolic information ...
stopped in main at line 5
5 for (i = 0; i < 10;);
(dbx) quit
現(xiàn)在你可以獲得程序出現(xiàn)問題的位置了。
以上程序在UNIX AIX4.3下調(diào)試通過。