在 UNIX 下調試程序,如果遇到內存溢出等問題的時候,經常在當前目錄下出現這樣一個文件: core
用指令 >ls –l 可以發現, core 是一個很大的文件,動輒上百 M ,很是耗費硬盤空間,所以一般我們都會及時將它清除掉,從而很少去關注它的真正內涵。其實 core 中放置的是執行進程的內存映像,其中的提示信息 core dump 就是信息轉儲的意思,在調試一個有問題的程序時它經常是很起作用的。下面我們就來探討一下,如何有效的利用這個 core 文件來調試我們的代碼。
1 .例如調試程序一段名爲 samp.c 的程序,如下進行調試
$ cc -g samp.c -o samp
$ samp
當程序在運行的時候出現一個
Bus Error - core dumped
的提示,現在 core 生成了,爲了獲得錯誤出現的位置,輸入
$ 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 聯繫進程,程序如下:
/***********
* looper.c: *
************/
main()
{
int i,x[10];
for (i = 0; i < 10;);
}
很顯然這是一個死循環程序,先編譯
$ cc -g looper.c -o looper
$ looper
當程序運行時,在另一個打開的窗口裏用指令 ps -u UserID 獲得進程 looper 的 ID,
PID TTY TIME COMMAND
68 console 0:04 sh
467 lft3 10:48 looper
從而得到進程的 ID 467 , 下面執行 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
現在你可以獲得程序出現問題的位置了。
以上程序在 UNIX AIX4.3 下調試通過。