文章目录1. coredump1.1 coredump简介1.2 coredump的文件存储路径1.3 coredump产生的条件1.4 coredump产生原因2. 测试生成coredump
1. coredump
1.1 coredump简介
core dump,又称为核心转储,是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件
coredump文件含有当进程被终止时内存、CPU寄存器和各种函数调用堆栈信息等,可以供后续开发人员进行调试
1.2 coredump的文件存储路径
一般情况使用下列命令可以看到core文件的存储位置:
cat /proc/sys/kernel/core_pattern
1
个人的如下:
我们可以通过修改kernel的参数来指定内核生成的coredump文件的文件名。常见设置如下:
//在终端键入下列命令
echo "/data/coredump/core.%e.%p" > /proc/sys/kernel/core_pattern
12
在这条命令中,/data/coredump是你自己指定的存放coredump文件的路径,所有产生的coredump文件将会存放在这里,%e表示程序的文件名,%p表示进程的ID(当然还有一些其他的参数可以设置,例:%t显示创建的时间)
在这里个人蠢了一下,没有创建存放的目录即/data/coredump,导致后面一直无法生成coredump文件,后面加上mkdir /data/coredump即创建成功,os:真是被自己蠢哭了
1.3 coredump产生的条件
首先确定当前会话的能生成的coredump文件大小,如果为0则不会产生对应的coredump文件:
这个时候就需要修改和设置了,可以使用下列两种方式设置:
//当前有效的修改
ulimit -c [size]  //这里size一般修改为unlimited
//可以使用ulimit -a访问详细信息
ulimit -a
1234
上述修改方式在关闭后再重启就无效了,所以采用下列方式使它永久有效:
//修改/etc/profile配置
vim /etc/profile
//添加 ulimit -c unlimited
123
然后执行source /etc/profile或者关闭重新开启就能生效了
1.4 coredump产生原因
1.内存访问越界
具体原因可能是:1.由于使用错误下标,导致数组访问越界
2.搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符
3.使用strcpy,strcat,sprintf等字符串操作函数时,容易出现读写越界的情况
2.多线程程序使用了线程不安全的函数
3.多线程读写的数据未枷锁保护
4.非法指针、包括使用空指针或随意使用指针转换
5.堆栈溢出
2. 测试生成coredump
//测试文件
#include <iostream>
int main()
{
    int b = 1;
    int* a;
    *a = b;
    return 0;
}
123456789
很明显a指针指向错误,会产生段错误,首先编译该文件,执行文件:
g++ -g -o test test.cpp    //编译得到可执行文件test
./test   //运行可执行文件
12
得到如下结果,显示生成了coredump文件:
现在去存储coredump文件的目录查找该coredump,并将其移出到表目录进行分析:
cd /data/coredump    //自己设置的存储目录
ls -l       //列出文件
cp core.test.32469 /home/ubuntu    //拷贝core文件到表目录,test为文件名,32469为进程ID
123
进入存储目录查看coredump文件:
移动到表目录:
该文件也是ELF文件,可以采用readelf查看该文件:
//例:
readelf -h core.test.32469
12
当我们使用gdb调试时,是先从可执行文件中读取符号表信息,然后再读取core文件。这个步骤会让人疑问,难道core文件中无符号表信息么?不与可执行文件一同执行可以么?
我们可以直接查看core文件是否含有符号表信息,执行以下命令:
objdump -x core.test.32469 | tail
1
其中可以看到SYMBOL TABLE:  no symbols,表明当前的ELF文件中没有符号表信息
接下来利用gdb进行分析(须带可执行文件):
gdb test core.test.32469
1
可以看到core在第六行:
接着打印a和b的值:
可以看到指针a指向的明显不是b的地址,所以引发了段错误
到这里我们的gdb调试分析coredump就结束了,想了解更多有关gdb调试的可以访问本人的这篇文章【linux】gdb调试
------------------------------------------get------------------------------------------------------
1.coredump文件
2.使用gdb调试分析coredump
---------------------

原文:https://blog.csdn.net/qq_38790716/article/details/85107405

Linux gdb分析core dump文件的更多相关文章

  1. Unix 用gdb分析core dump文件

    产生core文件条件 用ulimit -c 指定core文件大小来开启core文件的生成,如:ulimit -c unlimited 用gdb分析core文件的条件 可执行程序在编译时,需加入-g参数 ...

  2. ZT 用gdb调试core dump文件

    用gdb调试core dump文件 转载自:http://blog.chinaunix.net/u2/83905/showart_2134570.html 在Unix系统下,应用程序崩溃,一般会产生c ...

  3. linux下生成core dump文件方法及设置

    linux下生成core dump文件方法及设置    from:http://www.cppblog.com/kongque/archive/2011/03/07/141262.html core ...

  4. linux下生成core dump文件方法及设置【转】

    转自:http://blog.csdn.net/mrjy1475726263/article/details/44116289 源自:http://andyniu.iteye.com/blog/196 ...

  5. linux下生成core dump文件方法

    core 文件的简单介绍 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”).我们可以认为 co ...

  6. 使用GDB 追踪依赖poco的so程序,core dump文件分析.

    前言 在windows 下 系统核心态程序蓝屏,会产生dump文件. 用户级程序在设置后,程序崩溃也会产生dump文件.以方便开发者用windbg进行分析. so,linux 系统也有一套这样的东东- ...

  7. Linux上Core Dump文件的形成和分析

    原文: http://baidutech.blog.51cto.com/4114344/904419 Core,又称之为Core Dump文件,是Unix/Linux操作系统的一种机制,对于线上服务而 ...

  8. Linux使用笔记: 定制core dump文件的文件名

    在开发过程中,当一个Linux程序异常退出时,我们可以通过core文件来分析它异常的详细原因.缺省情况下,Linux在程序异常时不产生core文件,要想让程序异常退出时产生core dump文件,需要 ...

  9. linux 下如何打开core dump文件开关

    dump文件可以在程序crash时,方便我们查看程序crash的地方和上下文信息.在window下,要能生成dump文件,需要自己编写相应的代码.不过现在网上可以找到相应的代码,只要把它下载后然后加到 ...

随机推荐

  1. Redis 的基本操作、Key的操作及命名规范

    Redis基本操作 查看数据的状态 pong redis 给我们返回 PONG,表示 redis 服务 运行正常 redis 默认用 使用 16 个 库 • Redis 默认使用 16 个库,从 0 ...

  2. 利用Python进行数据分析 第8章 数据规整:聚合、合并和重塑.md

    学习时间:2019/11/03 周日晚上23点半开始,计划1110学完 学习目标:Page218-249,共32页:目标6天学完(按每页20min.每天1小时/每天3页,需10天) 实际反馈:实际XX ...

  3. vue的生命周期 created mounted等

    生命周期: beforeCreate 在实例初始化之后,数据观测和event/watcher时间配置之前被调用 created 页面加载之前执行,在实例创建完成后被立即调用.执行顺序:父组件-子组件 ...

  4. vs setup 自动下载依赖的framework配置

    1.项目->属性->签名->选中为ClickOnce清单签名->创建测试证书 2.项目->属性->安全性->启用ClickOnce安全设置 3.setup项目 ...

  5. 怎样查看python的所有关键字

    关键字是python中具有特定功能的一组词汇, 这些词汇不能用作变量名, 一般会有高亮提示, code时请小心. python的关键字其实也是python的语法核心, 掌握了所有python关键字的用 ...

  6. J.U.C之重入锁:ReentrantLock

    此篇博客所有源码均来自JDK 1.8 ReentrantLock,可重入锁,是一种递归无阻塞的同步机制.它可以等同于synchronized的使用,但是ReentrantLock提供了比synchro ...

  7. putty使用方法

    putty是一种体体积小,无需安装的一款免费安全使用方便的绿色软件,它主要用于远程控制linux系统,只要获取了远程的linux的地址,便可以远程控制linux系统以方便管理,越来越受到各方面的欢迎. ...

  8. Thinkphp中的assign() 和 display()

    说到 $this->assign()  与 $this->display()想必用过TP框架的都不陌生,那么今天我们就来说说他们的作用及其他用法. 先说 $this->assign( ...

  9. Java 之 Properties类 属性集

    一.概述 java.util.Properties集合 extends Hashtable<k,v> implements Map<k,v> java.util.Propert ...

  10. FI-TCODE收集

    主数据:FS00         编辑总帐科目FS01         创建主记录FS02         更改主记录FS03         显示主记录FS04         总帐科目更改(集中地 ...