我的公司正在利用 Linux(特别是 CentOS)中的核心转储功能来追踪一些难以发现的问题。不幸的是,我们有一堆在有限的 HD 空间上运行的小型虚拟机,并且由于堆占用了大量空间,完整的核心转储导致了问题。
是否可以让 Linux 在发生段错误时转储调用堆栈、线程和局部变量?我尝试将转储限制为 50 兆字节,但似乎所有需要的详细信息都不在前 50 兆字节 (ulimit -c 51200) 中。我们可以像那样截断堆,但我一直没能找到合适的大小。
我知道可以在需要时使用一些额外的代码写出您自己的调用堆栈,但我们正处于结束阶段,对于我们正在运行的最后几个问题来说,这将是一个艰难的推销进入。
最佳答案
您可以将核心转储通过管道传输到程序,从而编写您自己的过滤器。 摘自 man core
从内核 2.6.19 开始,Linux 支持替代语法 /proc/sys/kernel/core_pattern 文件。如果这个的第一个字符 文件是管道符号 (|),则该行的其余部分是 解释为要执行的程序。而不是被写入 磁盘文件,核心转储作为程序的标准输入。
您还可以控制将哪些映射写入核心转储,这可能用于减小核心转储的大小。
从内核 2.6.23 开始,Linux 特定的/proc/PID/coredump_filter 文件可用于控制将哪些内存段写入核心转储文件
当然,所有这些都取决于内核版本和配置选项。
请参阅我提供的链接以获取示例或详细信息。
关于linux - 是否可以获得仅包含调用堆栈、线程和局部变量的 Linux 核心转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18911367/