c++ - 当我从 cron 运行通常会核心的东西时,我怎么还能得到我的核心转储?

标签 c++ c unix cron coredump

今天我 cron 和我尝试检测核心转储并提醒我的东西确实遇到了错误的断言(当我在前台或后台在命令行上运行它时通常会核心转储它)但没有核心是倾倒。我写了这个简单的测试:

int main
{
sleep(3);
assert(false);
}

当我编译和运行时,它会一直进行核心转储。但是当我把它放在 crontab 上时,我却收到一封来自 cron 守护进程的电子邮件,上面写着:

rocket: main.cpp:10: int main(int, char**): Assertion `false' failed.
/bin/sh: line 1: 32448 Aborted                 ./rocket

/cores 中没有放置核心文件。为什么会这样,我怎样才能得到我的核心?

最佳答案

要在崩溃时生成核心文件,必须在当前环境中启用核心转储。在 shell 中,这可以使用 ulimit 来完成:

ulimit -c unlimited

这意味着“将最大核心转储大小设置为无限制”。您的系统可能配置为在交互式 shell 中执行此操作,但不是在 cron 作业中。要从 cron 作业执行此操作,您需要修改此限制。如果 cron 作业是调用其他程序的 shell 脚本,您可以像上面那样调用 ulimit。另一方面,如果作业是可执行文件,您可以创建一个包装器来运行它:

#!/bin/bash
ulimit -c unlimited
exec "$@"

另一种选择是修改程序以使用 setrlimit 自行设置限制。功能。

至于为什么您的内核会进入/cores 而不是工作目录:您的发行版可能已经调整了 core pattern ,可能使用程序来处理核心文件并将它们放在/cores 中。

关于c++ - 当我从 cron 运行通常会核心的东西时,我怎么还能得到我的核心转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12326040/

相关文章:

c++ - 树递归错误

bash - 在 unix 中排序,而其他字段没有改变

c++ - 消除 MS Visual C++ 链接器警告 : "warning LNK4221"? 的最佳方法是什么

c++ - 打破 for 循环 C++

c++ - 我的 Linux 应用程序端口在停止时被另一个服务占用

使用c从一个txt文件复制到另一个txt文件

c - 如何通过套接字发送结构?

c# - Active Directory - 使用 C# 的用户的 UNIX 属性

linux - 数据库备份未写入光盘,空间不足?

c++ - g++ mysql 链接器错误