Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

在AIX中文件名为core的文件有用吗?

Posted on 2008-10-29 15:02 Prayer 阅读(485) 评论(0)  编辑 收藏 引用 所属分类: LINUX/UNIX/AIX
Q:在AIX系统中,经常会看到文件名为core的文件,这个文件有用处吗?如果有用,怎么使用?

  A:当进程在异常终止运行时,系统会把该进程对应的地址空间中的数据写到core文件中(这个过程被称为dump),以便程序员对其进行分析,找出进程异常终止的原因。缺省情况下,异常终止的进程在启动它的当前目录下产生core文件。

  在AIX 4.3.3中,所有的core文件的文件名都是core,如果不只一个程序产生dump或者相同的程序dump多次,它们都会产生相同文件名的core文件,那么就会丢失比较早的core文件。从AIX 5.1开始,改变了core文件的命名方法,使得每一个core文件拥有惟一的文件名,从而避免了新的core文件覆盖旧的core文件,这个特色更加有助于程序员调试和跟踪运行失败的程序。

  默认情况下,一个core文件的文件名是core。要使用AIX 5L中core文件命名的新方法,就要把CORE_NAMING环境变量的值设置为yes。

  在AIX 5L中,把当前用户的CORE_NAMING环境变量的值设置成yes之后,随后启动的进程产生的core文件名才能惟一的。新的core文件名的格式是core.pid.ddhhmmss。其中pid是进程号,dd是当前月份中的日子,hh表示小时,mm表示分,ss表示秒。

  对于一个占用内存资源很大的进程产生的core文件也非常大,因此如果经常有进程产生core文件,而core文件名都不相同,那么产生的core就会占用非常多的文件系统空间,所以系统管理员要定期为程序员收集这些core文件,并删除这些文件。在AIX 5.3中,用户可以设置产生压缩的core文件和指定一个目录来保存core文件,用lscore命令查看当前用户或指定用户的core设置,例如:

  $ lscore compression: off path specification: off corefile location: not set naming specification: off $

  要查看peter用户的core设置,命令是lscore peter。查看整个系统的core设置,命令是lscore –d 用chcore命令修改当前用户的core设置,例如: $ chcore –c on –p on –l /tmp/coredir –n on

  上面的命令修改当前用户的core设置,-c on参数的作用是打开压缩core文件功能,用户可以用uncompress命令来解压缩,-p on参数的作用是打开指定的core文件位置,保存core文件的目录是由-l参数指定为/tmp/coredir目录,-n on参数的作用相当于把CORE_NAMING环境变量值设置为yes。其中on表示打开这些功能,将on换成off表示关闭这些功能。

  如果要修改指定用户的core设置,在上面的命令最后加上用户名,要修改整个系统的core设置,在上面的命令最后加上-d即可。其实每个用户的core设置保存在/etc/security/user文件中,chcore和lscore命令存取user文件的内容,读者可以参考user文件的内容用vi来设置某个用户的core设置。

 每一个core dump会产生一个新的错误日志记录。用errpt命令查看这样的错误日志记录可以帮助程序员识别导致core dump的应用程序。程序员可以用dbx命令来调试产生core文件的程序,要用dbx命令调试有问题的程序时,必须保证core文件和产生core文件的程序都在当前目录下,调试程序的最简单的命令格式如下:

  $ dbx ProgramFile CoreFile

  ProgramFile是程序文件名,CoreFile是core文件名。在dbx中用where子命令可以查看程序在异常终止时正在执行的函数名,也就是说能够查看程序在执行哪个函数时而异常终止的,然后在源程序中找这个函数,再进一步定位异常语句。dbx命令的详细用法读者可以参考dbx命令的手册。

  当一个进程正在运行时,如果程序员想获得这个进程所占内存空间中的内容,可以用gencore命令把这个进程对应的地址空间中的数据写到一个指定的文件中,gencore命令并不会终止进程的运行。例如要把进程号为3682983的进程的内存镜像写到文件名为/tmp/core. 3682983的文件中,命令如下:

  $ gencore 3682983 /tmp/core.3682983

  如果gencore命令指定的core文件名带有路径,那么用chcore命令所修改的core设置中core文件名和core文件保存目录就无效了。


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理