核心转储文件名称被截断

如果将/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这个名字,这是一个更深层次的问题,但这是内核内部的东西,这里有一些讨论。