在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下调试通过。