天天看点

linux下根据core文件定位崩溃

放开core资源限制

linux下默认是不产生core文件的,要用 ulimit -c unlimited 放开

切记,该动作只对当前登录客户端有效,重新开启的ssh客户端无效,所以,设置后不要更换ssh登录再去定位!!!!!!!!

[[email protected] ~]# ulimit -c unlimited

[[email protected] ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 127331
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 10240
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 10240
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[[email protected] ~]# 
           

选项 [options]

-H

设置硬资源限制,一旦设置不能增加。

ulimit – Hs 64;限制硬资源,线程栈大小为 64K。

-S

设置软资源限制,设置后可以增加,但是不能超过硬资源设置。

ulimit – Sn 32;限制软资源,32 个文件描述符。

-a

显示当前所有的 limit 信息。

ulimit – a;显示当前所有的 limit 信息。

-c

最大的 core 文件的大小, 以 blocks 为单位。

ulimit – c unlimited; 对生成的 core 文件的大小不进行限制。

-d

进程最大的数据段的大小,以 Kbytes 为单位。

ulimit -d unlimited;对进程的数据段大小不进行限制。

-f

进程可以创建文件的最大值,以 blocks 为单位。

ulimit – f 2048;限制进程可以创建的最大文件大小为 2048 blocks。

-l

最大可加锁内存大小,以 Kbytes 为单位。

ulimit – l 32;限制最大可加锁内存大小为 32 Kbytes。

-m

最大内存大小,以 Kbytes 为单位。

ulimit – m unlimited;对最大内存不进行限制。

-n

可以打开最大文件描述符的数量。

ulimit – n 128;限制最大可以使用 128 个文件描述符。

-p

管道缓冲区的大小,以 Kbytes 为单位。

ulimit – p 512;限制管道缓冲区的大小为 512 Kbytes。

-s

线程栈大小,以 Kbytes 为单位。

ulimit – s 512;限制线程栈的大小为 512 Kbytes。

-t

最大的 CPU 占用时间,以秒为单位。

ulimit – t unlimited;对最大的 CPU 占用时间不进行限制。

-u

用户最大可用的进程数。

ulimit – u 64;限制用户最多可以使用 64 个进程。

-v

进程最大可用的虚拟内存,以 Kbytes 为单位。

ulimit – v 200000;限制最大可用的虚拟内存为 200000 Kbytes。

设置core文件生成路径

core file生成的地方是在/proc/sys/kernel/core_pattern文件定义的。

改动到生成到自己定义的目录的方法是:

echo “pattern” > /proc/sys/kernel/core_pattern

并且只有超级用户可以修改这两个文件。

"pattern"类似我们C语言打印字符串的格式,相关标识如下:

%p: 相当于pid

%s: 相当于导致dump的信号的数字

%t: 相当于dump的时间

%h: 相当于hostname

%e: 相当于执行文件的名称

这时用如下命令设置生成的core file到系统/tmp目录下,并记录pid以及执行文件名

echo “/tmp/core-%e-%p” > /proc/sys/kernel/core_pattern

测试代码

#include
int func(int *p)
{
        *p = 0;
}
int main()
{
        func(NULL);
        return 0;
}
生成可执行文件并运行
gcc -o main a.c

[email protected]:~# ./main
Segmentation fault (core dumped) 
<-----这里出现段错误并生成core文件了。
在/tmp目录下发现文件core-main-10815 
           

如何根据core文件定位问题

  1. 我们可以用

    gdb main /tmp/core-main-10815

    查看信息,发现能定位到函数了

    Program terminated with signal 11, Segmentation fault.

    #0 0x080483ba in func ()

  2. 在编译的时候开启-g调试开关就可以定位到行

    gcc -o main -g a.c

    gdb main /tmp/core-main-10815

    最终看到的结果如下,好棒。

    Program terminated with signal 11, Segmentation fault.

    #0 0x080483ba in func (p=0x0) at a.c:5

    5 *p = 0;

继续阅读