coredump介绍和使用

目录

1 什么是coredump

2 如何开启coredump功能

2.1 设置core文件的大小的方法:

2.2 设置core文件的路径

3 出现coredump的几种情况

3.1 内存访问越界

3.2 多线程程序使用了线程不安全的函数。

3.3 多线程读写的数据未加锁保护。

3.4 非法指针

3.5 堆栈溢出

4 示例


1 什么是coredump

coredump是程序崩溃时的内存快照。

操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运行堆栈等信息转储保存在一个文件里。

2 如何开启coredump功能

ulimit -c 可以设置core文件的大小,如果这个值为0.则不会产生core文件,这个值太小,则core文件也不会产生,因为core文件一般都比较大。

2.1 设置core文件的大小的方法:

1、ulimit -c unlimited

暂时生效

2、/etc/security/limits.conf

* soft core unlimited

* hard core unlimited

永久生效

3、/etc/profile

ulimit -c unlimited

永久生效

2.2 设置core文件的路径

在/proc/sys/kernel/core_pattern文件中添加/var/crash/coredump.%e.%p,这样就可以在/var/crash中生成coredump文件了。

3 出现coredump的几种情况

3.1 内存访问越界

a) 由于使用错误的下标,导致数组访问越界。

 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符。

 c) 使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。

3.2 多线程程序使用了线程不安全的函数。

应该使用可重入的函数。

3.3 多线程读写的数据未加锁保护。

对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成coredump

3.4 非法指针

a) 使用空指针

b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump。

3.5 堆栈溢出

不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。 

4 示例

写一个内存访问越界的代码。

int main() {
    char *s = "hello world";
    *(s+1000) = 'x';
    return 0;
}

 编译的时候要打开-g选项,然后进行运行。

parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ gcc core.c -g -o core
parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ ll
total 24
drwxrwxr-x  2 parallels parallels  4096 May 10 00:55 ./
drwxrwxr-x 11 parallels parallels  4096 May  9 22:20 ../
-rwxrwxr-x  1 parallels parallels 10192 May 10 00:55 core*
-rw-rw-r--  1 parallels parallels    78 May  9 22:24 core.c
parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ ./core 
Segmentation fault (core dumped)
parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ 

再使用gdb来调试coredump文件

parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ ll /var/crash/
total 1028
drwxrwsrwt  2 root      whoopsie     4096 May 10 00:55 ./
drwxr-xr-x 14 root      root         4096 Mar 13  2021 ../
-rw-------  1 parallels whoopsie   229376 May 10 00:55 coredump.core.330074
-rw-------  1 parallels whoopsie 17321984 May  9 22:29 coredump.thread.320247
-rw-r-----  1 root      whoopsie   798088 May  9 18:58 _usr_libexec_fwupd_fwupd.0.crash
parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ mv /var/crash/coredump.core.330074 ./
parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ ll
total 116
drwxrwxr-x  2 parallels parallels   4096 May 10 00:57 ./
drwxrwxr-x 11 parallels parallels   4096 May  9 22:20 ../
-rwxrwxr-x  1 parallels parallels  10192 May 10 00:55 core*
-rw-rw-r--  1 parallels parallels     78 May  9 22:24 core.c
-rw-------  1 parallels whoopsie  229376 May 10 00:55 coredump.core.330074
parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ gdb core coredump.core.330074
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "aarch64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
    .

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from core...
[New LWP 330074]
Core was generated by `./core'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000aaaad33e0738 in main () at core.c:3
3	    *(s+1000) = 'x';
(gdb) 

从上面可以看出程序的问题出现在第3行。 

×

你可能感兴趣的:(linux学习,程序设计,coredump,gdb)