全部
我的 C++ 程序生成了多达 2GB 的核心转储,它很快就填满了所有可用的磁盘空间。我真正需要的只是回溯。我想知道如果我想保留回溯,核心转储文件的安全大小是多少。此外,我想知道是否还有其他智能解决方案。
谢谢!詹姆斯
答案1
您可以将核心转储直接通过管道传输到程序中,该程序会将跟踪保存到临时位置,获取回溯,然后将其放在用户可以访问的地方,然后删除核心。请参阅man 5 core
如何使用核心转储模式执行操作的示例。本质上,您可以设置内核控制值,kernel.coredump_pattern
将核心转储通过管道传输到特定程序中。这样,您就可以完全控制何时保存核心转储以及何时不保存核心转储的逻辑。请注意,您通过管道传输到的程序以 root 身份运行!
|/usr/local/bin/coredump_it.sh
就是这样做的一个例子。
或者,systemd
已经提供了执行此操作的功能。如果您像这样设置 coredump 模式
kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %p %u %g %s %t %e
然后,您可以使用该命令coredumpctl
来存储和检索所述 coredump 的回溯。例如,其中 coredump 是针对 PID 24164 的。
coredumpctl info 24164
$ coredumpctl info 24164
PID: 24164 (bintree)
UID: 1000 (matthew)
GID: 1000 (matthew)
Signal: 11 (SEGV)
Timestamp: Mon 2015-02-09 19:14:13 GMT (1 months 19 days ago)
Command Line: ./bintree
Executable: /home/matthew/Testbed/trees/binary/bintree
Control Group: /user.slice/user-1000.slice/session-1.scope
Unit: session-1.scope
Slice: user-1000.slice
Session: 1
Owner UID: 1000 (matthew)
Boot ID: 82a18962ecc34109965530967f12150b
Machine ID: 69d27b356a94476da859461d3a3bc6fd
Hostname: home.localdomain
Message: Process 24164 (bintree) of user 1000 dumped core.
Stack trace of thread 24164:
#0 0x0000000000400680 bintree_fetch (bintree)
#1 0x0000000000400a7e main (bintree)
#2 0x000000316fc1ffe0 __libc_start_main (libc.so.6)
#3 0x0000000000400589 _start (bintree)
您可以直接调用coredumpctl
来获取已保存的核心转储列表。