放开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文件定位问题
-
我们可以用
gdb main /tmp/core-main-10815
查看信息,发现能定位到函数了
Program terminated with signal 11, Segmentation fault.
#0 0x080483ba in func ()
-
在编译的时候开启-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;