Linux coredump解决流程

一、打开core文件限制

a.sudo vi /etc/profile

b.文件末尾添加ulimit -c unlimited

source /etc/profile

把文件重新加载到内存

[email protected]:~/code# ulimit -c

unlimited

说明core文件限制已经去处。

二、让core文件生成在进程当前目录

echo "core-%e-%p-%t" > /proc/sys/kernel/core_pattern

三、写一个同一块内存释放两次引起coredump的例子定位并解决

a.编写err.cpp代码如下,同一块内存释放了两次。

[email protected]:~/code# cat err.cpp

#include<cstdlib>

using namespace std;

void repeatFree(char *p)

{

if(NULL != p)

{

free(p);

}

}

int main()

{

char* pstr =(char*) malloc(1024);

free(pstr);

repeatFree(pstr);

}

b.g++ -o err err.cpp

编译生成err可执行文件。

c.  ./err

[email protected]:~/code# ./err

*** Error in `./err‘: double free or corruption (top): 0x0000000001911010 ***

======= Backtrace: =========

/lib/x86_64-linux-gnu/libc.so.6(+0x77725)[0x7fbe4039f725]

/lib/x86_64-linux-gnu/libc.so.6(+0x7ff4a)[0x7fbe403a7f4a]

/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7fbe403ababc]

./err[0x400585]

./err[0x4005b6]

/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fbe40348830]

./err[0x400499]

======= Memory map: ========

00400000-00401000 r-xp 00000000 08:01 398325 /root/code/err

00600000-00601000 r--p 00000000 08:01 398325 /root/code/err

00601000-00602000 rw-p 00001000 08:01 398325 /root/code/err

01911000-01932000 rw-p 00000000 00:00 0   [heap]

7fbe3c000000-7fbe3c021000 rw-p 00000000 00:00 0

7fbe3c021000-7fbe40000000 ---p 00000000 00:00 0

7fbe40112000-7fbe40128000 r-xp 00000000 08:01 791701  /lib/x86_64-linux-gnu/libgcc_s.so.1

7fbe40128000-7fbe40327000 ---p 00016000 08:01 791701  /lib/x86_64-linux-gnu/libgcc_s.so.1

7fbe40327000-7fbe40328000 rw-p 00015000 08:01 791701  /lib/x86_64-linux-gnu/libgcc_s.so.1

7fbe40328000-7fbe404e8000 r-xp 00000000 08:01 791663  /lib/x86_64-linux-gnu/libc-2.23.so

7fbe404e8000-7fbe406e7000 ---p 001c0000 08:01 791663  /lib/x86_64-linux-gnu/libc-2.23.so

7fbe406e7000-7fbe406eb000 r--p 001bf000 08:01 791663  /lib/x86_64-linux-gnu/libc-2.23.so

7fbe406eb000-7fbe406ed000 rw-p 001c3000 08:01 791663  /lib/x86_64-linux-gnu/libc-2.23.so

7fbe406ed000-7fbe406f1000 rw-p 00000000 00:00 0

7fbe406f1000-7fbe40717000 r-xp 00000000 08:01 791635  /lib/x86_64-linux-gnu/ld-2.23.so

7fbe408fb000-7fbe408fe000 rw-p 00000000 00:00 0

7fbe40913000-7fbe40916000 rw-p 00000000 00:00 0

7fbe40916000-7fbe40917000 r--p 00025000 08:01 791635  /lib/x86_64-linux-gnu/ld-2.23.so

7fbe40917000-7fbe40918000 rw-p 00026000 08:01 791635  /lib/x86_64-linux-gnu/ld-2.23.so

7fbe40918000-7fbe40919000 rw-p 00000000 00:00 0

7ffe51f1b000-7ffe51f3c000 rw-p 00000000 00:00 0       [stack]

7ffe51ff4000-7ffe51ff6000 r--p 00000000 00:00 0       [vvar]

7ffe51ff6000-7ffe51ff8000 r-xp 00000000 00:00 0       [vdso]

ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]

Aborted (core dumped)

产生了core文件

[email protected]:~/code# ll

total 168

drwxr-xr-x  2 root root   4096 Mar  9 18:20 ./

drwx------ 10 root root   4096 Mar  9 18:18 ../

-rw-------  1 root root 544768 Mar  9 18:20 core-err-9665-1489112441

-rwxr-xr-x  1 root root   8696 Mar  9 18:20 err*

-rw-r--r--  1 root root    185 Mar  9 18:18 err.cpp

d.gdb ./err core-err-9665-1489112441

执行gdb 执行程序 core文件,然后在gdb里面where

[email protected]:~/code# gdb ./err core-err-9665-1489112441

GNU gdb (Ubuntu 7.11-0ubuntu1) 7.11

Copyright (C) 2016 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

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 "x86_64-linux-gnu".

Type "show configuration" for configuration details.

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>.

Find the GDB manual and other documentation resources online at:

<http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".

Type "apropos word" to search for commands related to "word"...

Reading symbols from ./err...(no debugging symbols found)...done.

[New LWP 9665]

Core was generated by `./err‘.

Program terminated with signal SIGABRT, Aborted.

#0  0x00007fbe4035d418 in __GI_raise ([email protected]=6) at ../sysdeps/unix/sysv/linux/raise.c:54

54../sysdeps/unix/sysv/linux/raise.c: No such file or directory.

(gdb) where

#0  0x00007fbe4035d418 in __GI_raise ([email protected]=6) at ../sysdeps/unix/sysv/linux/raise.c:54

#1  0x00007fbe4035f01a in __GI_abort () at abort.c:89

#2  0x00007fbe4039f72a in __libc_message ([email protected]=2, [email protected]=0x7fbe404b86b0 "*** Error in `%s‘: %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:175

#3  0x00007fbe403a7f4a in malloc_printerr (ar_ptr=<optimized out>, ptr=<optimized out>, str=0x7fbe404b87a0 "double free or corruption (top)", action=3) at malloc.c:5007

#4  _int_free (av=<optimized out>, p=<optimized out>, have_lock=0) at malloc.c:3868

#5  0x00007fbe403ababc in __GI___libc_free (mem=<optimized out>) at malloc.c:2969

#6  0x0000000000400585 in repeatFree(char*) ()

#7  0x00000000004005b6 in main ()

通过调堆栈就能发现死在repeatFree(char*)函数里面,重复释放了同一块内存。

时间: 2024-12-04 17:33:34

Linux coredump解决流程的相关文章

重装linux服务器简易流程

项目开发软件开发非常重要的一个环节,而能够拥有一个安全健康的服务器来使System正常高效的运行也是非常有必要的.由于是搭建在外网上的服务器,时不时会受到各种病毒的侵袭,这篇博客不写如何进行防御各种病毒,而是讲一下,如果发生了这种情况.如何通过最笨的一种方法,重装服务器来解决这个问题,这里把流程注意事项讲述一下. 一个项目已经上线了,发生了这种情况,一般情况下会让我们晚上在有限的时间内重装完毕,回复原样,我们需要提前做好准备,确保能够完成.好这里看一下,在重装服务器前后我们需要考虑的各项事宜,及

Linux 的启动流程

作者: 阮一峰 半年前,我写了<计算机是如何启动的?>,探讨BIOS和主引导记录的作用. 那篇文章不涉及操作系统,只与主板的板载程序有关.今天,我想接着往下写,探讨操作系统接管硬件以后发生的事情,也就是操作系统的启动流程. 这个部分比较有意思.因为在BIOS阶段,计算机的行为基本上被写死了,程序员可以做的事情并不多:但是,一旦进入操作系统,程序员几乎可以定制所有方面.所以,这个部分与程序员的关系更密切. 我主要关心的是Linux操作系统,它是目前服务器端的主流操作系统.下面的内容针对的是Deb

Linux的启动流程(CentOS 6)

前言 Linux启动的过程在实际生产中有着至关重要的作用.试想一下,如果我们在实际生产中服务器因为某一个服务出了问题,而不能启动,这时我们应该怎么办.如果我们了解Linux的详细启动过程,知道是在哪一个环节出了问题,我们就能够进入到相应的环节,排除掉相应的问题,从而解决实际生产中的问题. 同时,我们在这里提出一个问题,有谁知道Windows的启动过程呢?如果启动过程出了问题,我们该怎么办呢?恐怕答案只有重启系统了吧-- Linux 系统的启动过程对于管理员来说是完全透明的,了解了Linux的启动

linux --&gt; Linux 的启动流程

Linux 的启动流程 操作系统接管硬件以后发生的事情,也就是操作系统的启动流程. 因为在BIOS阶段,计算机的行为基本上被写死了,程序员可以做的事情并不多:但一旦进入操作系统,程序员几乎可以定制所有方面.所以,这个部分与程序员的关系更密切,下面的内容针对的是Debian发行版. 第一步.加载内核 操作系统接管硬件以后,首先读入 /boot 目录下的内核文件. 以我的电脑为例,/boot 目录下面大概是这样一些文件: $ ls /boot config-3.2.0-3-amd64 config-

Linux的启动流程(CentOS 7)

前言 Linux启动的过程在实际生产中有着至关重要的作用.试想一下,如果我们在实际生产中服务器因为某一个服务出了问题,而不能启动,这时我们应该怎么办.如果我们了解Linux的详细启动过程,知道是在哪一个环节出了问题,我们就能够进入到相应的环节,排除掉相应的问题,从而解决实际生产中的问题. 同时,我们在这里提出一个问题,有谁知道Windows的启动过程呢?如果启动过程出了问题,我们该怎么办呢?恐怕答案只有重启系统了吧-- Linux 系统的启动过程对于管理员来说是完全透明的,了解了Linux的启动

I.MX6 Linux Qt 启动流程跟踪

/************************************************************************** * I.MX6 Linux Qt 启动流程跟踪 * 声明: * 1. 源代码来源MY-I.MX6: * 2. 本文仅仅是对启动流程的解析,没有解释启动流程为什么是这样的问题. * * 2015-6-13 深圳 晴 南山平山村 曾剑锋 *********************************************************

【转】Linux 的启动流程

原文网址:http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html Linux 的启动流程 作者: 阮一峰 半年前,我写了<计算机是如何启动的?>,探讨BIOS和主引导记录的作用. 那篇文章不涉及操作系统,只与主板的板载程序有关.今天,我想接着往下写,探讨操作系统接管硬件以后发生的事情,也就是操作系统的启动流程. 这个部分比较有意思.因为在BIOS阶段,计算机的行为基本上被写死了,程序员可以做的事情并不多:但是,一旦进入操作系

Linux操作系统启动流程

一般来说,所有的操作系统的启动流程基本就是: 总的来说,linux系统启动流程可以简单总结为以下几步:1)开机BIOS自检,加载硬盘.2)读取MBR,进行MBR引导.3)grub引导菜单(Boot Loader).4)加载内核kernel.5)启动init进程,依据inittab文件设定运行级别6)init进程,执行rc.sysinit文件.7)启动内核模块,执行不同级别的脚本程序.8)执行/etc/rc.d/rc.local9)启动mingetty,进入系统登陆界面. linux系统安装时,如

linux操作系统启动流程和光盘镜像制作

1.简述linux操作系统启动流程 POST (加电自检):自检主要硬件设备如:CPU.内存.硬盘是否正常,以及输入输出设备是否存在问题等. BIOS(Boot Sequence):BIOS(基本的输入输出系统)装载在硬件芯片CMOS之上,自检时会启动这个程序,并根据CMOS上的配置信息去读取其他的硬件信息,检测正常之后进行硬件设备的初始化. 读取MBR:引导加载程序,在MBR(主引导记录)中,主要功能是识别,加载系统的核心文件,并提交到内存中运行来启动对应的系统. Kernel运行:Kerne