概述
Segmentation fault (core dumped)
多为内存不当操作造成。空指针、野指针的读写操作,数组越界访问,破坏常量等。对每个指针声明后进行初始化为NULL
是避免这个问题的好办法。排除此问题的最好办法则是调试。
- 由于使用错误的下标,导致数组访问越界
- 使用
strcpy, strcat, sprintf, strcmp, strcasecmp
等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp
等函数防止读写越界
调试技巧ulimit
-
先使用
ulimit -c
查看下默认的core生成文件大小限制。
core file size 就表示core文件的大小是0字节,所以,是默认不产生core文件的。 -
如果太小就修改下:
ulimit -c 1024
-c
之后的数字就是修改core大小的。 -
这个时候在将程序编译一下,编译后运行。则会生成
core.xxxx
文件,xxxx
是程序运行的pid
-
gdb core-file core.xxx
进行调试,则可以定位问题。
ulimit
使用指南
ULIMIT(3) Linux Programmer's Manual ULIMIT(3)
NAME
ulimit - get and set user limits
SYNOPSIS
#include <ulimit.h>
long ulimit(int cmd, long newlimit);
DESCRIPTION
Warning: this routine is obsolete. Use getrlimit(2), setrlimit(2), and sysconf(3) instead. For the shell command
ulimit(), see bash(1).
The ulimit() call will get or set some limit for the calling process. The cmd argument can have one of the following val‐
ues.
UL_GETFSIZE
Return the limit on the size of a file, in units of 512 bytes.
UL_SETFSIZE
Set the limit on the size of a file.
3 (Not implemented for Linux.) Return the maximum possible address of the data segment.
4 (Implemented but no symbolic constant provided.) Return the maximum number of files that the calling process can
open.
RETURN VALUE
On success, ulimit() returns a nonnegative value. On error, -1 is returned, and errno is set appropriately.
ERRORS
EPERM An unprivileged process tried to increase a limit.
ATTRIBUTES
For an explanation of the terms used in this section, see attributes(7).
┌──────────┬───────────────┬─────────┐
│Interface │ Attribute │ Value │
├──────────┼───────────────┼─────────┤
│ulimit() │ Thread safety │ MT-Safe │
└──────────┴───────────────┴─────────┘
CONFORMING TO
SVr4, POSIX.1-2001. POSIX.1-2008 marks ulimit() as obsolete.
SEE ALSO
bash(1), getrlimit(2), setrlimit(2), sysconf(3)
COLOPHON
This page is part of release 4.15 of the Linux man-pages project. A description of the project, information about report‐
ing bugs, and the latest version of this page, can be found at https://www.kernel.org/doc/man-pages/.
Linux 2017-09-15 ULIMIT(3)