Linux环境中以daemon方式运行的程序生成core dump
2014-06-06 17:07
495 查看
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:/# echo `/data/coredump/core-%e-%p-%t` > /proc/sys/kernel/core_pattern
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
在/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:/# echo `/data/coredump/core-%e-%p-%t` > /proc/sys/kernel/core_pattern
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
相关文章推荐
- Linux环境中以daemon方式运行的程序生成core dump
- Linux环境中以daemon方式运行的程序生成core dump
- Qt官方开发环境生成的exe发布方式--使用windeployqt(windeployqt是单独的程序,放在低版本qt4目录下也可以运行的)
- 在linux 上编译生成windows上运行的exe程序,交叉编译环境的配置( 平台:gentoo linux)
- Unix/Linux中后台运行程序(断开shell连接后继续执行)的几种方式
- [ZZ]如何将程序以Daemon方式运行?
- 让Java程序作为linux的Daemon后台运行
- 在linux中,让程序进入后台运行的命令—>daemon程序
- 让Java程序作为linux的Daemon后台运行
- GNU/Linux平台的C程序开发及程序运行环境
- linux 使用非当前登录运行程序方式,如root登录用test运行一个test.sh
- vs2005 vc++ 生成非托管的 不需要.net运行环境的exe程序方法
- Linux下和编译器、程序的运行、环境变量等相关的常见问题
- 以NFS启动方式构建arm-linux仿真运行环境
- Linux中让程序或者命令后台运行的方式
- Linux下C++程序获取运行时间的一种方式
- 【嵌入式Linux学习七步曲之第二篇 ARM+Linux开发环境】gdb+gdbserver的方式进行ARM程序调试
- sunsunsun000的分享 分享 Linux环境生成core文件 &&Linux Core Dump 配置与调试
- 命令行方式实现第一个CUDA程序的运行(Win7环境)
- Linux/Unix环境下计算C程序运行时间