文章目录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. csdn博客整理

    @TOC 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown ...

  2. Python中的if语句——参考Python编程从入门到实践

    条件测试 1. 检查是否相等 一个等号表示赋值,两个等号用于判断等号左右两边是否相等,返回值为True或者False. 2. 检查是否相等是需考虑大小写 大小写不同的值视为不相等,例如继续写入代码:c ...

  3. hadoop 节点退役和服役

    节点的服役和退役(hdfs)---------------------- 黑白名单的组合情况-------------------------include //dfs.includeexclude ...

  4. Spring Boot集成Spring Data Jpa完整实例

    步骤: 添加依赖: 配置文件: 出了数据库的配置,还要配置jpa相关的: 实体类: Dao接口: 定义一个查询的方法,如果是jpa默认就有也可以不写: 测试: 如果报下面的错误,说明jdk9中缺少相关 ...

  5. vue cli3 项目优化

    vue-cli3 Prefetch (官网内容) <link rel="prefetch"> 是一种 resource hint,用来告诉浏览器在页面加载完成后,利用空 ...

  6. 第一章 Java的IO演进之路

    Unix中5种IO模型 就网络通信而言,一次数据读入可以分为两个阶段,首先等待数据从网络中到达,到达后需要复制到内核的缓冲区中,第二个阶段是从内核的缓冲区复制到进程的缓冲区,复制到进程的缓冲区才算读取 ...

  7. cmake用法及常用命令总结(全)

    CMakeLists.txt 的语法比较简单,由命令.注释和空格组成,其中命令是不区分大小写的.指令是大小写无关的,参数和变量是大小写相关的.但推荐全部使用大写指令.符号 # 后面的内容被认为是注释. ...

  8. H5 - 简学

    什么是HTML? HTML 是用来描述网页的一种语言. 0.HTML 指的是超文本标记语言 1.HTML 不是一种编程语言,而是一种标记语言 2.标记语言是一套标记标签 3.HTML 使用标记标签来描 ...

  9. stm32和sd卡

    SD卡从容量上讲分两种:标准容量和大容量,最小的是标准容量,小于等于2G 其中的访问关系如下: SD卡分为两种模式:认证模式和传输模式,每一个模式包含着不同的状态,如下 以下主要讲其初始化过程: SD ...

  10. 【前端开发】】js中var写和不写的区别

    js中var用与不用的区别 Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的.可以正常运行的代码并不代表是合适的代码. v ...