core文件如何分析

目录

        • (一)什么是coredump
        • (二)coredump产生的条件
          • (1)coredump产生主要原因:
          • (2)如何生成coredump
        • (三)gdb使用
        • (四)实例调试coredump文件
        • (五)总结

(一)什么是coredump

应用程序运行出错或异常退出时,在满足一定条件下产生一个core文件,例如程序收到SIGABRT、SIGEMT等信号时(注:在signal.h里说明了哪些新号会产生coredump)都会出现coredump,我们平时见到最多的应该就是段错误。
core文件包含了程序运行时内存、寄存器状态、堆栈指针、内存管理信息以及函数调用堆栈信息。
我们通过分析core文件可以找到应用程序崩溃的地方

(二)coredump产生的条件

(1)coredump产生主要原因:
1、内存访问越界
2、多线程程序使用了线程不安全的函数。
3、多线程读写的数据未加锁保护。
4、非法指针
5、堆栈溢出
(2)如何生成coredump

1. 首先需要内核支持kernel选项
在这里插入图片描述
2. 设置ulimit -c unlimited

可以通过ulimit -a查看core文件大小限制,core文件大小不能太小,否则不能生成core文件

3. 默认core文件生成在当前目录,可以通过下面命令修改生成位置

可以通过/proc/sys/kernel/core_pattern进行设置。%p  出Core进程的PID
%u  出Core进程的UID
%s  造成Core的signal号
%t  出Core的时间,从1970-01-0100:00:00开始的秒数
%e  出Core进程对应的可执行文件名
eg:echo "core-%e-%p-%s-%t" > /proc/sys/kernel/core_pattern。

在每个进程下都有coredump_filter节点/proc/pid/coredump_filter。

通过配置coredump_filter可以选择需在coredump的时候,将哪些内容dump到core文件中。

(三)gdb使用

这里介绍gdb命令,下一小节直接实例介绍使用流程,这里可以跳过,用的时候回来看

 gdb 源程序 core文件
命令解释
list/l查看程序 list +函数名称/行号
list 显示当前行后面的源程序
list -显示当前行前面的源程序
run/r运行程序,设置运行参数
help显示帮助信息
start单步执行,运行程序,停在第一条执行语句
break/bbreak function在指定的函数停止
break 行号 在指定代码行打断
break +offset/break -offset在当前行的前面或后面的offset行打断点,offset为自然数
break 在下一条命令处停止运行
break … if < condition>如设置break if i=100表示当i为100时程序停止运行
info查看信息
info break [n]其中n 表示断点号来查看断点信息
info signals info handle: 查看有哪些信号正在被gdb检测
next < count>单步跟踪,如果有函数调用不会进入函数,如果后面不加count表示一条一条的执行,加count表示执行后面的count条指令
step < count>单步跟踪,如果有函数调用则进入该函数(进入该函数前提是此函数编译有Debug信息),与next类似,其不加count表示一条一条执行,加上count表示自当前行开始执行count条代码指令
finish运行程序直到当前函数完成并打印函数返回时的堆栈地址和返回值及参数值等信息
until运行程序直到退出循环体
continue/c当程序遇到断点停止运行后可以使用continue命令恢复程序的运行到下一个断点或直到程序结束
print命令查看变量
set设置变量的值
x查看内存 格式x /nfu addr
watch命令watch命令一般来观察某个表达式(变量也可视为一种表达式)的值是否发生了变化,如果由变化则程序立即停止运行
return命令如果在函数中设置了调试断点,在断点后还有语句没有执行完,这个时候我们可以使用return命令强制函数忽略还没有执行的语句并返回。
quit/q退出gdb调试
whatis/ptype显示变量的类型
bt显示函数调用路径

(四)实例调试coredump文件

用一个最简单的例子模拟一下coredump

#include <stdio.h>
#include <unistd.h>int main(int argc,char * argv[])
{char * pStr="helloworld\n";printf("%s\n",pStr);pStr[1] = 'y';return 0; 
}

运行一下

root@l-virtual-machine:~/hc# gcc coretest.c 
root@l-virtual-machine:~/hc# ./a.out 
helloworld段错误 (核心已转储)
root@l-virtual-machine:~/hc# ls
a.out  core  coretest.c 

编译的时候一定要加入-g选项,要不然在最后显示错误的时候只会显示错的地址,而不会显示错误的具体信息
这个时候有了core文件,我们查看这个文件类型,使用file或readelf -h

命令 file core //将core这个文件的具体信息给显示出来,命令最后会显示这个core文件是通过哪个文件产生的root@l-virtual-machine:~/hc# file core
core: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './a.out'

在这里插入图片描述从红色方框截图可以看到,程序中止是因为信号SIGSEGV,且从bt(backtrace)命令(或者where)可以看到函数的调用栈,即程序执行到coretest.c的第8行,修改pStr导致的
在这里插入图片描述在这里插入图片描述

(五)总结

在我们编译程序时要使用-g选项保留一份程序,方便出问题时我们定位问题所在,core文件使用时注意:

(1)保证进程对生成core的目录有读写权限
(2)若程序调用seteuid()/setegid() 改变了进程的有效用户或组,则默认情况下系统不为这些进程生成 core 文件。除非将 /proc/sys/fs /suid_dumpable 文件的内容改为1(一般默认是0)。
(3)设置足够大的Core文件大小限制,否则不能生成core文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC+FreeMarker

前言&#xff1a; 最近在学习SpringMVC&#xff0c;模板引擎用的是FreeMarker&#xff0c;之前没有接触过。利用SpringMVC开发其实还有许多的步骤&#xff0c;比如控制层&#xff0c;服务层&#xff0c;持久化层&#xff0c;实体等等&#xff0c;先弄了一个小demo来总结一下Spr…

SpringMVC那点事

一、SpringMVC返回json数据的三种方式 1、第一种方式是spring2时代的产物&#xff0c;也就是每个json视图controller配置一个Jsoniew。 如&#xff1a;<bean id"defaultJsonView" class"org.springframework.web.servlet.view.json.MappingJacksonJsonView&q…

(一)最邻近插值python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;最邻近插值实现&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;最邻近插值实现 一般情况下我…

(二)双线性插值python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;双线性插值原理&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;双线性插值原理 一般情况下我…

(三)图像转灰度图Python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;转换原理&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;转换原理 &#xff08;三&#xff…

java泛型上下限

前言&#xff1a; java的泛型上下限不是很好理解&#xff0c;尤其像我这种菜鸡。反反复复看了好几遍了...&#xff0c;真是... 一、简单的继承体系 class Person{}class Student extends Person{}class Worker extends Person{} 二、泛型上限&#xff08;extends 关键字&#x…

基于matlab的步进电机仿真(一)

这里写目录标题环境准备基础准备模型参数输入和输出仿真原理图仿真资源环境准备 MatLab2021b 基础准备 打开Matlab&#xff0c;在帮助文档里面搜索step motor,我们这里选择如下模型 该模型实现了一个通用的步进电机模型&#xff1a; 可变磁阻步进电机永磁或混合步进电机 …

java自定义类加载器

前言 java反射&#xff0c;最常用的Class.forName()方法。做毕设的时候&#xff0c;接收到代码字符串&#xff0c;通过 JavaCompiler将代码字符串生成A.class文件&#xff08;存放在classpath下&#xff0c;也就是eclipse项目中的bin目录里&#xff09;&#xff0c;然后通过jav…

repo介绍(一)

repo简介 Repo 是我们以 Git 为基础构建的代码库管理工具,可以组织多个仓库的上传和下载。它是由一系列的Python脚本组成&#xff0c;封装了一系列的Git命令&#xff0c;用来统一管理多个Git仓库 一个大型的项目可能由很多小的仓库组合而成的&#xff0c;为了方便统一管理各个…

hash长度扩展攻击

作为一个信息安全的人&#xff0c;打各个学校的CTF比赛是比较重要的&#xff01; 最近一个朋友发了道题目过来&#xff0c;发现有道题目比较有意思&#xff0c;这里跟大家分享下 这串代码的大致意思是&#xff1a; 这段代码首先引入了一个名为"flag.php"的文件&am…

repo介绍(二)

这篇文章来实例操作 安装repo&#xff0c;参考repo介绍这一节创建repo存放default.xml 的git仓库 初始化repo&#xff0c;repo init -u https://gitee.com/angerial/repo-test.git 这个时候会在当前目录生成如下文件 参考repo组成&#xff0c;修改.repo/manifest.xml,这里我的…

springmvc环境搭建以及常见问题解决

1.新建maven工程 a) 打开eclipse&#xff0c;file->new->project->Maven->Maven Project b) 下一步 c) 选择创建的工程为webapp&#xff0c;下一步 d) 填写项目的group id和artifact id。一般情况下&#xff0c;group id写域名的倒序&#xff0c;artifact id…

eclipse build workspace太慢或者 js出错问题解决

1.js文件错误解决办法 右键项目->properties->Builders(注&#xff1a;JavaScript Validator也会引起 build workspace太慢) 2.Eclipse 一直不停 building workspace完美解决总结&#xff08;来自: http://blog.163.com/shadow_wolf/blog/static/18346909720145279519222…

springmvc+jpa实现分页的两种方式

1.工具类 public final class QueryTool {public static PageRequest buildPageRequest(int pageNumber, int pageSize, String sortType){Sort sort null;if("auto".equals(sortType)) {sort new Sort(Direction.DESC, "ctime");} else {sort new Sort…

不使用session,借助redis实现验证码

1.首先看一下基本的流程 2.看一下代码 注&#xff1a;其中用到的一些工具类&#xff0c;可以到我的github上去下载 https://github.com/hjzgg/usually_util/tree/master/utils windows 下的 redis下载 https://github.com/hjzgg/redis 获取验证码的tooken RequestMapping(value…

PS批处理的使用

一、 前言 做开发的时候&#xff0c;最多的时候就是图片的使用了。有时候图片的处理都按照同样的步骤&#xff0c;比如说统一将图片的大小调整为固定大小&#xff0c;或者统一在所有的图片的的某个位置上加入文字或者小图片等等&#xff0c;这时候PS的批处理可以帮你完成这些重…

exe4j的使用

下载&#xff1a;http://download.cnet.com/exe4j/3000-2070_4-144405.html 参考&#xff1a;http://blog.chinaunix.net/uid-25749806-id-4380850.html 注&#xff1a;打包成jar包的一般就是src目录&#xff0c;其他目录放到目标文件夹中&#xff0c;目录结构如下 如何解决exe…

android表白app

一、前言 马上就要520和521了&#xff0c;是不是还有像我一样的单身狗啊。我就知道有&#xff0c;所以这两天简单写了这个小程序&#xff08;其实是替别人写的&#xff09;&#xff0c;虽然我并不会用去骗女孩子&#xff08;因为最近太忙了&#xff0c;实习完之后要搞毕设&…

webpack+react+es6开发模式

一、前言 实习了两个月&#xff0c;把在公司用到的前端开发模式做个简单的整理。公司里前端开发模式webpackreactreduxes6&#xff0c;这里去掉了redux。 webpack, react, redux等学习网址&#xff1a;http://www.cnblogs.com/hujunzheng/p/5405780.html 二、简单的步骤条组件 …

git命令分类图

转载于:https://www.cnblogs.com/hujunzheng/p/5560826.html