Total Pageviews

Sunday, 4 December 2011

定制core dump文件的文件名

在开发过程中,当一个Linux程序异常退出时,我们可以通过core文件来分析它异常的详细原因。缺省情况下,Linux在程序异常时不产生core文件,要想让程序异常退出时产生core dump文件,需要使用ulimit命令更改coredump的设置:
ulimit -c unlimited 
上面的命令表示在程序异常时产生core dump文件,并且不对core dump文件的大小进行限制。
上述设置只是使能了core dump功能,缺省情况下,内核在coredump时所产生的core文件放在与该程序相同的目录中,并且文件名固定为core。很显然,如果有多个程序产生core文件,或者同一个程序多次崩溃,就会重复覆盖同一个core文件。
我们通过修改kernel的参数,可以指定内核所生成的coredump文件的文件名。例如,Easwy使用下面的命令使kernel生成名字为core.filename.pid格式的core dump文件:
echo 'core.%e.%p' > /proc/sys/kernel/core_pattern 
这样配置后,产生的core文件中将带有崩溃的程序名、以及它的进程ID。上面的%e%p会被替换成程序文件名以及进程ID。
可以在core_pattern模板中使用变量还很多,见下面的列表:
  • %% 单个%字符
  • %p 所dump进程的进程ID
  • %u 所dump进程的实际用户ID
  • %g 所dump进程的实际组ID
  • %s 导致本次core dump的信号
  • %t core dump的时间 (由1970年1月1日计起的秒数)
  • %h 主机名
  • %e 程序文件名
如果在上述文件名中包含目录分隔符”/“,那么所生成的core文件将会被放到指定的目录中。
需要说明的是,在内核中还有一个与coredump相关的设置,就是/proc/sys/kernel/core_uses_pid。如果这个文件的内容被配置成1,那么即使core_pattern中没有设置%p,最后生成的core dump文件名仍会加上进程ID。
对所生成的core dump进程分析,需要使用调试工具,例如GDB等。

No comments:

Post a Comment