信号是操作系统和用户应用之间的进程间通讯。Linux 使用 POSIX 标准中定义的信号。在你的系统上,你可以在 /usr/include/bits/signum-generic.h 找到标准信号的定义。如果你想知道更多关于在你的应用程序中使用信号的信息,这有一个信息丰富的 signal 手册页。简单地说,Linux 基于预期的或意外的信号来触发进一步的活动。
当你退出一个正在运行的应用程序时,应用程序通常会收到 SIGTERM 信号。因为这种类型的退出信号是预期的,所以这个操作不会创建一个内存转储。
以下信号将导致创建一个转储文件(来源:GNU C库):
SIGFPE:错误的算术操作
SIGILL:非法指令
SIGSEGV:对存储的无效访问
SIGBUS:总线错误
SIGABRT:程序检测到的错误,并通过调用 abort() 来报告
SIGIOT:这个信号在 Fedora 上已经过时,过去在 PDP-11 上用 abort() 时触发,现在映射到 SIGABRT
创建转储文件
导航到 core_dump_example 目录,运行 make,并使用 -c1 开关执行该示例二进制:
./coredump -c1
该应用将以状态 4 退出,带有如下错误:
Dump written“Abgebrochen (Speicherabzug geschrieben) ”(LCTT 译注:这是德语,应该是因为本文作者系统是德语环境)大致翻译为“分段故障(核心转储)”。
是否创建核心转储是由运行该进程的用户的资源限制决定的。你可以用 ulimit 命令修改资源限制。
检查当前创建核心转储的设置:
ulimit -c
如果它输出 unlimited,那么它使用的是(建议的)默认值。否则,用以下方法纠正限制:
ulimit -c unlimited
要禁用创建核心转储,可以设置其大小为 0:
ulimit -c 0
这个数字指定了核心转储文件的大小,单位是块。