Linux环境中以daemon方式运行的程序生成core dump
1 精要
- 在
/etc/profile
中添加: ulimit -c unlimited > /dev/null 2?&1
- 修改
/proc/sys/kernel/core_pattern
文件中的 core dump 文件格式为绝对路径,比如:
/data/coredump/core-%e-%p-%t
注意/proc/sys/kernel/core_pattern
的修改方式是:
poechant@dev:~$ su
Password:
root@dev:/
2 详解
一般在 CLI 上启动的程序,如果设置:
ulimit -c unlimited
就可以在程序以外终止时生成 core dump 文件。但是对于 daemon 方式运行的程序,其与 CLI 启动的程序的主要区别是进程的运行环境,其中就包括 cwd(current working directory)。如果以相对路径方式定义 core 文件的格式,比如定义 /proc/sys/kernel/core_pattern 为:
core-%e-%p-%t
则一般来说,daemon 文件的 cwd 就是/
,你可以通过/proc/<your_program_pid>/cwd
来查看,一般都是连接到/
目录。而如果用户对这个目录没有写权限,那么就不会生成 core dump 文件了。
最直接的解决的方法,是修改/proc/sys/kernel/core_pattern
为绝对路径:
/data/coredump/core-%e-%p-%t
并且保证这样就基本 OK 了。你可以通过程序来测试一下。两种简单的方式是:
2.1 两个测试小例子
2.1.1 W1S 方式 (While-1-Sleep)
编写一个简单的程序如下:
#include <unistd.h>
int main() {
while (1) {
sleep(1);
}
return 0;
}
编译运行后使用如下命令让程序生成 core dump 文件:
kill -ABRT <program_pid>
-ABRT
也可以用-6
,都是表示abort
信号。或者利用 GDB:
gdb -p <program_pid>
(gdb) gcore <core_filename>
Saved corefile <core_filename>
也可以生成 core dump 文件。
2.1.2 故意产生一个 segment fault
int main(void) {
int* p = NULL;
delete p;
}
编译运行就会被终止生成 core dump 文件。
以上两种方式,core dump 文件应该都是按照你设定的/proc/sys/kernel/core_pattern
来生成的。
2.2 core_pattern 格式详解
%% A single % character
%p PID of dumped process
%u real UID of dumped process
%g real GID of dumped process
%s number of signal causing dump
%t time of dump (seconds since 0:00h, 1 Jan 1970)
%h hostname (same as ’nodename’ returned by uname(2))
%e executable filename
2.3 core_uses_pid 作用
/proc/sys/kernel/core_pattern
中未定义%p
时,/proc/sys/kernel/core_uses_pid
文件中定义是否在 core dump 文件名后追加进程ID.PID
。
echo 1 > /proc/sys/kernel/core_uses_pid 使得 core文件名后包含 .PID
echo 0 > /proc/sys/kernel/core_uses_pid 使得core文件名后不包含 .PID
3 Reference
- http://blog.csdn.net/iterzebra/article/details/6205848
-
转载请注明来自柳大·Poechant(钟超)的CSDN博客:Blog.CSDN.net/Poechant
-
分享到:
相关推荐
如何在让docker中运行的进程生成core dump文件
在Linux系统中,Daemon程序是不可或缺的一部分,它们作为后台服务长期运行,提供各种系统功能和服务。Daemon不依赖于任何终端,通常在系统启动时启动,系统关闭时终止。这类程序通常用于网络服务(如HTTP服务器)、...
当我们从控制终端运行 `myserver` 程序时,它从 Linux 系统中继承了一个终端的连接,这个终端被指定为 `myserver` 程序的控制终端。我们可以使用这个控制终端对 `myserver` 程序进行控制,可以按下 `Ctrl+C` 组合键...
在Linux环境下运行Java程序是许多开发人员...总的来说,Linux下的Java程序运行涉及到环境配置、程序编译、权限管理以及进程控制等多个方面。了解和掌握这些技能,将有助于你在Linux环境中高效地管理和运行Java应用。
在Linux中,可以使用`system()`函数或者`popen()`来执行命令行操作,例如`pgrep`命令来查找指定的进程。 ```cpp #include #include #include bool isProgramRunning(const std::string& programName) { std::...
在Linux操作系统中,守护进程(daemon)是一种在后台运行的程序,它们通常在系统启动时启动,并持续运行直到系统关闭,执行诸如网络服务、计划任务等任务。"linux daemon monitor"是一个重要的工具,用于监控这些...
【守护进程】在Linux系统中,守护进程(Daemon)是一种在后台运行且不与终端关联的进程,通常用于提供持续性的服务。守护进程在启动时会脱离控制终端,避免受到用户登录登出的影响,以便长期稳定地运行。守护进程常...
`dbus-daemon`是D-Bus消息总线服务的后台进程,它在Linux中负责进程间通信(IPC)。蓝牙服务在Linux中通常依赖于D-Bus来协调不同组件之间的交互,例如,用户界面与蓝牙服务之间的通信。`dbus-daemon`使得应用程序...
【标题】:深入解析...总之,分析jstack生成的Thread Dump日志,需要结合线程状态、堆栈信息和系统资源状况,以确定线程的行为模式和可能的问题。通过这些信息,开发者可以定位并解决并发问题,优化Java应用的性能。
在IT行业中,daemon进程通常指的是在后台运行的系统服务,它们独立于终端并持续运行,为其他应用程序提供必要的服务。生成daemon进程的脚本通常使用shell编写,因为shell脚本是一种方便、灵活的自动化工具,尤其适用...
在Linux系统中,守护进程(Daemon)是一种在后台运行且没有控制终端的程序,它们通常在系统启动时启动,负责执行特定的任务,如网络服务、系统管理等。本资源"my_linux_daemon.rar"提供了一个适合Linux初学者的简单...
在Linux系统中,守护进程(Daemon)是一种在后台运行且没有控制终端的进程,它们通常用于执行特定的服务或任务,例如网络服务、日志管理、计划任务等。本主题聚焦于如何创建一个守护进程,使其每隔几秒钟检查指定...
软看门狗守护进程(daemon)是一种后台运行的程序,其主要任务是定期向软看门狗设备发送保持活动的信号,以防止系统因为长时间无响应而被强制重启。描述中提到,这种守护进程相比脚本编写的服务更高效,因为它占用的...
总的来说,Daemontools 4.11中文完美版是一个针对系统服务管理的强大工具,尤其适合需要在Windows环境中部署和维护服务的用户。其完善的中文支持使得非英语用户也能轻松上手,提升工作效率。在日常运维工作中,合理...
在Linux中专门提供了一个函数来完成这个daemon化的过程,这个函数的原型如下 int daemon (int __nochdir, int __noclose); 如果__nochdir的值为0,则将切换工作目录为根目录;如果__noclose为0,则将标准输入...
根据《linux/UNIX系统编程手册》的daemon章节写的一个测试become_daemon()函数程序。代码内容99%以上都是书上给的源码。此处仅注释掉不需要的内容,以及为了简化理解,做了不同平台的适配,(对于源码来说是种倒退,...
这个文件的命名方式表明它是一个版本号为0.8的守护进程(daemon)相关的程序。在Linux和Unix系统中,守护进程是一种在后台运行、不与终端直接关联的进程,通常用于提供持续的服务,如网络服务、计划任务等。 首先,...
在Linux系统中,Java应用程序通常以两种主要方式运行:直接通过命令行或作为守护进程(daemon)。本篇文章将深入探讨如何使用`sh`脚本来启动Java的JAR程序,并将其设置为守护进程,以便在后台持续运行,即使用户注销...
3. **Jsvc工具**:这是Apache Commons Daemon中的一个核心组件,它是一个命令行工具,用于在Unix和类Unix系统上以daemon方式运行Java应用程序。Jsvc可以管理Java应用的启动、停止、重启等操作,并能处理信号传递,如...
总结来说,利用Go语言开发跨平台守护程序是充分利用其语言优势的一种方式,能够帮助开发者创建出既能在服务器环境中运行,又能在嵌入式设备上高效工作的服务。通过深入学习`go-daemon-master`项目,你将掌握这一核心...