文章目录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. Git和Github的介绍、简单操作、冲突(上)

    目的:   1.git与github简介  2.Git与SVN区别 3.Github 的简单使用 4.下载安装Git-20-64-bit.exe   5.Git常用命令 5.1Git命令使用场景 5. ...

  2. NodeJS的环境搭建+传统ELmentui+vue开发

    ElementUI简介 我们学习VUE,知道它的核心思想式组件和数据驱动,但是每一个组件都需要自己编写模板,样式,添加事件,数据等是非常麻烦的, 所以饿了吗推出了基于VUE2.0的组件库,它的名称叫做 ...

  3. 使用winsw将springboot打包的jar注册系统本地服务

    1.下载winsw 下载地址:https://github.com/kohsuke/winsw/releases 我这里下载的是2.3.0版. 下载sample-minimal.xml和WinSW.N ...

  4. 利用RabbitMQ实现分布式事务

    实现要点:1.构建本地消息表及定时任务,确保消息可靠发送:2.RabbitMQ可靠消费:3.redis保证幂等 两个服务:订单服务和消息服务 订单服务消息可靠发送 使用springboot构建项目,相 ...

  5. 数据多的时候为什么要使用redis而不用mysql?

    2018-06-28  136465569...  转自 庆亮trj21bc... 修改   微信 分享: Redis和MySQL的应用场景是不同的. 通常来说,没有说用Redis就不用MySQL的这 ...

  6. 在ubuntu 16.04 的vm中添加新网卡,同一网段不同ip

    在ubuntu 16.04 的vm中添加新网卡,同一网段不同ip 来源 https://blog.51cto.com/744478/2083672 在ubuntu 16.04 的vm中新加了一块网卡, ...

  7. [技术翻译]您应该知道的13个有用的JavaScript数组技巧

    本次预计翻译三篇文章如下: 01.[译]9个可以让你在2020年成为前端专家的项目 02.[译]预加载响应式图像,从Chrome 73开始实现 03.[译]您应该知道的13个有用的JavaScript ...

  8. 在vue项目中使用live2d

    成品如图: 那么几步简单说明怎么用吧: 第一,先去github上下载相应的静态资源: https://github.com/xiazeyu/live2d-widget-models 第二,将packg ...

  9. 网络基础 InetAddress

    IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础.InetAddress是Java对IP地址的封装,在java.net中有许多类都使用到了 ...

  10. HTML和XML中的转义字符

    HTML中的转义字符  HTML中<, >,&等有特别含义,(前两个字符用于链接签,&用于转义),不能直接使用.使用这三个字符时,应使用他们的转义序列,如下所示: & ...