鉴于/proc/sys/kernel/core_pattern
中的配置设置为/cores/core.%e.%p
,核心转储根据模式命名,但对于运行具有长名称的可执行文件的进程,例如SampleCrashApplication
,生成的核心文件将包含截断的可执行文件名:/cores/core.SampleCrashAppl.9933
造成这种情况的原因是什么? man core
页面仅讨论最终核心文件名的最大大小为128(2.6.19之前的内核为64)
答案 0 :(得分:3)
可以在exec.c here中找到此代码。
代码将根据模式将corename复制到第一个百分比(给出/ cores / core。)。按百分比增加并处理'e'。用于处理'e'部分的代码使用基于current-> comm结构的snprintf打印出模式。
这是可执行的名称(不包括路径)TRUNCATED为值TASK_COMM_LEN。由于这被定义为16个字符(至少在我找到的内核中),因此SampleCrashApplication被截断为15 + 1个字符(最后为空字节为1),这解释了为什么会得到截断的核心转储名称。
为什么这个结构会截断名称TASK_COMM_LEN,这是一个更深层次的问题,但它是内核的内容,并且有一些讨论here。