我有一个进程在Linux得到一个分割错误。当它失败时,我如何告诉它生成一个核心转储?
当前回答
默认情况下,您将得到一个核心文件。检查进程的当前目录是否可写,否则不会创建核心文件。
其他回答
默认情况下,您将得到一个核心文件。检查进程的当前目录是否可写,否则不会创建核心文件。
如上所述,这里提出的真正问题是如何在未启用核心转储的系统上启用它们。这个问题在这里得到了解答。
如果您希望了解如何为挂起进程生成核心转储,那么答案是
gcore <pid>
如果gcore在您的系统上不可用,那么
kill -ABRT <pid>
不要使用kill -SEGV,因为它经常会调用信号处理程序,使诊断卡住进程更加困难
Ubuntu 19.04
其他的答案都帮不了我。但下面的总结起到了作用
创建~ /。配置/apport/settings包含以下内容:
[main]
unpackaged=true
(这告诉apport也为自定义应用程序编写核心转储)
检查:ulimit -c。如果输出0,用
ulimit -c unlimited
只是为了以防万一重启apport:
sudo systemctl restart apport
崩溃文件现在被写入/var/ Crash /。但是不能在gdb中使用它们。要在gdb中使用它们,请使用
apport-unpack <location_of_report> <target_directory>
进一步的信息:
一些回答建议更改core_pattern。请注意,重新启动时该文件可能会被apport服务覆盖。 仅仅停止出口并不能起到作用 ulimit -c值可能会在您尝试web的其他答案时自动更改。确保在设置核心转储创建过程中定期检查它。
引用:
https://stackoverflow.com/a/47481884/6702598
值得一提的是,如果你建立了一个系统,那么事情就会有点不同。通常情况下,通过core_pattern sysctl值将核心文件通过systemd-coredump(8)进行管道传输。核心文件大小rlimit通常已经配置为“unlimited”。
然后可以使用coredumpctl(1)检索核心转储。
coredump等的存储由coredump.conf(5)配置。在coredumpctl手册页中有一些如何获取核心文件的示例,但简而言之,它看起来像这样:
找到核心文件:
[vps@phoenix]~$ coredumpctl list test_me | tail -1
Sun 2019-01-20 11:17:33 CET 16163 1224 1224 11 present /home/vps/test_me
获取核心文件:
[vps@phoenix]~$ coredumpctl -o test_me.core dump 16163
最后我所做的是在进程崩溃之前将gdb附加到进程,然后当它出现段错误时,我执行generate-core-file命令。强制生成核心转储。