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