给定/proc/sys/kernel/core_pattern
中的配置设置为/cores/core.%e.%p
,核心转储将根据模式进行命名,但是对于运行具有长名称(例如, SampleCrashApplication
,生成的核心文件将包含截断的可执行文件名称:/cores/core.SampleCrashAppl.9933
是什么原因造成的? man core
页仅讨论最终核心文件名的最大大小为128(2.6.19之前的内核为64)
最佳答案
可以在exec.c here中找到此代码。
代码将根据模式将核心名复制到第一个百分比(给出/cores/core。)。以百分比表示,它将递增并处理“e”。用于处理“e”部分的代码使用基于当前-> comm结构的snprintf打印出图案。
这是TRUNCATED到值TASK_COMM_LEN的可执行文件名称(不包括路径)。由于这被定义为16个字符(至少在我找到的内核中),因此SampleCrashApplication被截断为15 + 1个字符(末尾的空字节为1个字符),这说明了为何获得截断的核心转储名称。
关于为什么此结构将名称TASK_COMM_LEN截断的问题,这是一个更深层的问题,但这是内核内部的问题,还有一些讨论here。
关于linux - 核心转储文件名被截断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1701161/