赞
踩
coredump是指当程序出错而异常中断时,OS会把程序工作的当前状态存储成一个coredunmp文件,一般用于进程崩溃的场景。
1. 检查系统 coredump 是否开启 # ulimit -c ---> 返回 0,则未启用。 2. 临时开启 # ulimit -c 1024 // 设置成 1024 byte 或者 # ulimit -c unlimited // 设置成无限大 3. 永久开启 方式一: a. 打开 /etc/profile 文件,增加如下内容并使其生效 # ulimit -S -c unlimited > /dev/null 2>&1 注意:如果该文件有 ulimit -S -c 0 > /dev/null 2>&1 一行,需要先将该行注释掉。 b. 设置完成后通过执行 source /etc/profile 生效。 方式二: a. 打开 /etc/security/limits.conf 文件,找到【* soft core 0】行,将其修改为如下内容: 这个方法可以针对指定用户或用户组打开core dump,如设置成【* soft core 10485760】,即core dump文件大小是10G 。
代码如下(示例):
filename: test.c #include <stdio.h> int square(int a, int b) { int ret; int *p = NULL; //此处是会导致coredump处 *p = 666; return ret; } int doCalc(int num1, int num2) { int ret = square(num1, num2); return ret; } int main() { int param1 = 1; int param2 = 2; int result = doCalc(param1, param2); printf( "result is %d\n", result); }
代码如下(示例):
# gcc -c -g test.c -o main // 编译时加入debug调试信息
如何确认已经开启了debug,执行以下命令:
objdump -h main | grep debug //会打印出debug相关字符
core 文件生成的位置默认是可执行文件所在的位置,名称默认为core,其位置和名称是可以设置的,我的设置为:
# mkdir /home/corefile
# echo "/home/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern // 设置core文件的生成路径
core 文件会生成在 /home/corefile/ 目录下。
顺便记录下% 后字母表示的意义。
%% 单个%字符
%p 所dump进程的进程ID
%u 所dump进程的实际用户ID
%g 所dump进程的实际组ID
%s 导致本次core dump的信号
%t core dump的时间 (由1970年1月1日计起的秒数)
%h 主机名
%e 程序文件名
执行 main ,生成 core 文件。
# cp main /home/corefile/ // 需要将可执行文件和core文件放在一个目录下
# gdb main core-main-5588_1636892983
--->
...
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000000000040053c in square (a=1, b=2) at test.c:7
7 *p = 666; // 可见在test.c中的第7行,出现了问题。
# (gdb) backtrace // 输入backtrace
--->
#0 0x000000000040053c in square (a=1, b=2) at test.c:7 // 可见在test.c中的第7行,出现了问题。
#1 0x0000000000400564 in doCalc (num1=1, num2=2) at test.c:14
#2 0x0000000000400591 in main () at test.c:22
可见,进程退出时,执行的最后一个函数是 square 函数,并且在第 7 行出现了问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。