文章目录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. centos 6.10 oracle 19c安装

    centos 7以下版本安装oracle 19c 问题较多,centos 以上版本没有任何问题.记录如下. hosts文件,否则图形界面无法启动 127.0.0.1 localhost localho ...

  2. 字典的学习3——嵌套——Python编程从入门到实践

    嵌套 ? 一系列字典存储在列表or列表作为值存储在字典or字典中套字典 1. 字典列表 alien_0 = {'color': 'green', 'points': 5} alien_1 = {'co ...

  3. python 使用API调用和风天气获取天气情况并保存

    第一步.注册注册免费API和阅读技术文档: 注册地址:https://console.heweather.com 注册完成后,激活登录后,新建应用 .新建key KEY名称 密钥ID 密钥 类型下载城 ...

  4. Python学习-55 小游戏- 猜大小

    #游戏开始,首先玩家选择大小,选择完成后开始摇骰子(11<=总值<=18为大,3<=总值<=10为小) import random def roll_dice(numbers= ...

  5. C++进行字母大小写转换

    #include <iostream> #include <Windows.h> #include <string> using namespace std; in ...

  6. go String接口方法

    该接口经常用于输出 struct 的值 或者记录struct数据日志 一个普遍存在的接口是 fmt 包中定义的 Stringer接口 发现 http://tour.studygolang.com/me ...

  7. SpringBoot学习(五)—— springboot快速整合Druid

    Druid连接池 简介 由阿里巴巴开源的druid连接池是目前综合实力最突出的数据库连接池,而且还提供了监控日志功能,能够分析SQL执行情况. 引入druid连接池 pom.xml中加入 <de ...

  8. myisam和innodb的区别,java事务不起作用原因

    myisam:只支持表级锁.不支持事务.方便移植.该类型是mysql默认表存储类型 innodb:支持表级锁和行级锁.支持事务. 如果你的事务不起作用,很可能是用了myisam存储引擎,检查数据表引擎 ...

  9. vue实现组件切换的两种方式

    <!DOCTYPE html> <html> <head> <title>组件的切换</title> <meta charset=&q ...

  10. TypeScript入门一:配置TS工作环境

    配置手动编译TS文件工作环境 配置webpack自动化打包编译工作环境(后面补充) 一.TypeScript入门学习引言 进入主题之前,首先说明这个系列的博客是我刚刚接触TypeScript的学习笔记 ...