/proc/sys/kernel/core_pattern
给定set to中的配置/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 打印出模式。
这是可执行文件名称(不包括路径)截断为值TASK_COMM_LEN。由于这被定义为 16 个字符(至少在我找到的内核中),因此 SampleCrashApplication 被截断为 15 + 1 个字符(最后的空字节为 1),这解释了为什么你得到截断的核心转储名称。
至于为什么这个结构会截断名称 TASK_COMM_LEN,这是一个更深层次的问题,但它是内核内部的东西,这里有一些讨论。