linux - 是否可以获得仅包含调用堆栈、线程和局部变量的 Linux 核心转储?

标签 linux segmentation-fault coredump

我的公司正在利用 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/

相关文章:

linux - 我如何在内核中使用性能计数器?

c++ - 具有两个线程的段错误逻辑

linux - 是否可以通过核心转储定期保存程序状态?

gdb - 无需 GDB 从 Core 文件获取 BackTrace

c++ - 访问类的 std::string 时崩溃

c - 如果使用 __INLINE__,速度会提高多少?

linux - Qt Creator 从 Windows 交叉编译 Raspberry Pi,发出远程运行应用程序的问题

linux - Grep 查找行中的多个值并仅输出多个值

C++:在作为参数传递的函数中读取数组时出现段错误

c - 为什么 char *str;被宣布为越界