37 coredump 的生成和使用

news2024/9/24 9:17:31

前言

呵呵 coredump 之前对于我而言也是一个挺陌生的概念  

但是 只从开始了 linux 的相关学习之后, 对于这个 概念也有了一些 理解 

呵呵 这里 以一些 简单的例子 来看一下 coredump 的生成和使用

首先执行 "ulimit -c unlimited" 

测试用例1 - 除数为 0 

root@ubuntu:~/Desktop/linux/HelloWorld# cat Test07GenCoreDump.c
#include "stdio.h"
 
int main(int argc, char** argv) {
 
int x = 2;
int y = 3;
int z = x + y;

//char* p = (char*) z;
//char pValue = *p;

char divZero = z / 0;

//setenv("name", "jerry");
//char* envName = getenv("name");
//printf(" envName = %s, %s \n", envName, z);

}

root@ubuntu:~/Desktop/linux/HelloWorld# ./Test07GenCoreDump 
Floating point exception (core dumped)

使用 gdb 来分析 coredump 文件, 呵呵 保留了完整的 内存信息, 这里可以查看代码, 查看数据, 查看地址信息 等等 

通过执行代码分析, 可以看到 报错的地方就是上面 "char divZero = z / 0;" 

使用的 idiv 指令, 除数为 cx 值为 0 

root@ubuntu:~/Desktop/linux/HelloWorld# gdb Test07GenCoreDump core 
// ... 
Core was generated by `./Test07GenCoreDump'.
Program terminated with signal SIGFPE, Arithmetic exception.
#0  0x0000000000400563 in main ()
(gdb) disassemble 
Dump of assembler code for function main:
   0x0000000000400536 <+0>:	push   %rbp
   0x0000000000400537 <+1>:	mov    %rsp,%rbp
   0x000000000040053a <+4>:	mov    %edi,-0x14(%rbp)
   0x000000000040053d <+7>:	mov    %rsi,-0x20(%rbp)
   0x0000000000400541 <+11>:	movl   $0x2,-0xc(%rbp)
   0x0000000000400548 <+18>:	movl   $0x3,-0x8(%rbp)
   0x000000000040054f <+25>:	mov    -0xc(%rbp),%edx
   0x0000000000400552 <+28>:	mov    -0x8(%rbp),%eax
   0x0000000000400555 <+31>:	add    %edx,%eax
   0x0000000000400557 <+33>:	mov    %eax,-0x4(%rbp)
   0x000000000040055a <+36>:	mov    -0x4(%rbp),%eax
   0x000000000040055d <+39>:	mov    $0x0,%ecx
   0x0000000000400562 <+44>:	cltd   
=> 0x0000000000400563 <+45>:	idiv   %ecx
   0x0000000000400565 <+47>:	mov    %al,-0xd(%rbp)
   0x0000000000400568 <+50>:	mov    $0x0,%eax
   0x000000000040056d <+55>:	pop    %rbp
   0x000000000040056e <+56>:	retq   
End of assembler dump.
(gdb) info registers
rax            0x5	5
rbx            0x0	0
rcx            0x0	0
rdx            0x0	0
rsi            0x7ffee58ad588	140732749501832
rdi            0x1	1
rbp            0x7ffee58ad4a0	0x7ffee58ad4a0
rsp            0x7ffee58ad4a0	0x7ffee58ad4a0
r8             0x4005e0	4195808
r9             0x7fe37847a6d0	140614952265424
r10            0x846	2118
r11            0x7fe3780ea640	140614948529728
r12            0x400440	4195392
r13            0x7ffee58ad580	140732749501824
r14            0x0	0
r15            0x0	0
rip            0x400563	0x400563 <main+45>
eflags         0x10206	[ PF IF RF ]
cs             0x33	51
ss             0x2b	43
ds             0x0	0
es             0x0	0
fs             0x0	0
gs             0x0	0

使用 gdb 调试, 这是 自动触发的异常断点, 可以看到 情况和上面 coredump 的内容是一致的 

但是这个是 gdb 调试, 但是 一些环境上面是不允许调试的, 因此 可以使用 coredump 的方式, 拿到 coredump, 拿下来线下分析 

dmesg 中系统日志如下 

[101412.158027] Test07GenCoreDu[38486]: segfault at 5 ip 00007f4062edbcd0 sp 00007fff37004b50 error 4 in libc-2.23.so[7f4062e8d000+1c0000]
[105827.007848] traps: Test07GenCoreDu[39281] trap divide error ip:400563 sp:7fffed673010 error:0 in Test07GenCoreDump[400000+1000]
[105855.994740] traps: Test07GenCoreDu[39284] trap divide error ip:400563 sp:7ffee58ad4a0 error:0 in Test07GenCoreDump[400000+1000]

测试用例2 - 非法地址访问

root@ubuntu:~/Desktop/linux/HelloWorld# cat Test07GenCoreDump.c
#include "stdio.h"
 
int main(int argc, char** argv) {
 
int x = 2;
int y = 3;
int z = x + y;

char* p = (char*) z;
char pValue = *p;

//char divZero = z / 0;

//setenv("name", "jerry");
//char* envName = getenv("name");
//printf(" envName = %s, %s \n", envName, z);

}

root@ubuntu:~/Desktop/linux/HelloWorld# ./Test07GenCoreDump 
Segmentation fault (core dumped)

gdb 调试 coredump 如下, 可以发现异常的地方在于 "char pValue = *p;" 

读取 rax 地址所在的数据, 然后传送给 rax, 但是 rax 为 5, 在当前程序的内存中没有 vma 包含 5, 系统抛出了 segment fault 

root@ubuntu:~/Desktop/linux/HelloWorld# gdb Test07GenCoreDump core 
// ... 
Core was generated by `./Test07GenCoreDump'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000000000400567 in main ()
(gdb) disassemble 
Dump of assembler code for function main:
   0x0000000000400536 <+0>:	push   %rbp
   0x0000000000400537 <+1>:	mov    %rsp,%rbp
   0x000000000040053a <+4>:	mov    %edi,-0x24(%rbp)
   0x000000000040053d <+7>:	mov    %rsi,-0x30(%rbp)
   0x0000000000400541 <+11>:	movl   $0x2,-0x14(%rbp)
   0x0000000000400548 <+18>:	movl   $0x3,-0x10(%rbp)
   0x000000000040054f <+25>:	mov    -0x14(%rbp),%edx
   0x0000000000400552 <+28>:	mov    -0x10(%rbp),%eax
   0x0000000000400555 <+31>:	add    %edx,%eax
   0x0000000000400557 <+33>:	mov    %eax,-0xc(%rbp)
   0x000000000040055a <+36>:	mov    -0xc(%rbp),%eax
   0x000000000040055d <+39>:	cltq   
   0x000000000040055f <+41>:	mov    %rax,-0x8(%rbp)
   0x0000000000400563 <+45>:	mov    -0x8(%rbp),%rax
=> 0x0000000000400567 <+49>:	movzbl (%rax),%eax
   0x000000000040056a <+52>:	mov    %al,-0x15(%rbp)
   0x000000000040056d <+55>:	mov    $0x0,%eax
   0x0000000000400572 <+60>:	pop    %rbp
   0x0000000000400573 <+61>:	retq   
End of assembler dump.
(gdb) info registers
rax            0x5	5
rbx            0x0	0
rcx            0x0	0
rdx            0x2	2
rsi            0x7fffbfc52468	140736410756200
rdi            0x1	1
rbp            0x7fffbfc52380	0x7fffbfc52380
rsp            0x7fffbfc52380	0x7fffbfc52380
r8             0x4005f0	4195824
r9             0x7f8d550456d0	140244993464016
r10            0x846	2118
r11            0x7f8d54cb5640	140244989728320
r12            0x400440	4195392
r13            0x7fffbfc52460	140736410756192
r14            0x0	0
r15            0x0	0
rip            0x400567	0x400567 <main+49>
eflags         0x10206	[ PF IF RF ]
cs             0x33	51
ss             0x2b	43
ds             0x0	0
es             0x0	0
fs             0x0	0
gs             0x0	0

gdb 调试也可以看到同样的情况, 异常的地方如下 

dmesg 中系统日志如下 

[106216.221912] Test07GenCoreDu[39375]: segfault at 5 ip 0000000000400567 sp 00007ffc6c08b1f0 error 4 in Test07GenCoreDump[400000+1000]

完 

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

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

相关文章

使用Kmeans算法完成聚类任务

聚类任务 聚类任务是一种无监督学习任务&#xff0c;其目的是将一组数据点划分成若干个类别或簇&#xff0c;使得同一个簇内的数据点之间的相似度尽可能高&#xff0c;而不同簇之间的相似度尽可能低。聚类算法可以帮助我们发现数据中的内在结构和模式&#xff0c;发现异常点和离…

FreeRTOS之二值信号量

什么是信号量&#xff1f; 信号量&#xff08;Semaphore&#xff09;&#xff0c;是在多任务环境下使用的一种机制&#xff0c;是可以用来保证两个或多个关键代 码段不被并发调用。 信号量这个名字&#xff0c;我们可以把它拆分来看&#xff0c;信号可以起到通知信号的作用&am…

五、控制流(2)

本章概要 returnbreak 和 continue臭名昭著的 gotoswitchswitch 字符串 return 在 Java 中有几个关键字代表无条件分支&#xff0c;这意味无需任何测试即可发生。这些关键字包括 return&#xff0c;break&#xff0c;continue 和跳转到带标签语句的方法&#xff0c;类似于其…

Spring Cloud Alibaba - Nacos源码分析(三)

目录 一、Nacos客户端服务订阅的事件机制 1、监听事件的注册 2、ServiceInfo处理 serviceInfoHolder.processServiceInfo 一、Nacos客户端服务订阅的事件机制 Nacos客户端订阅的核心流程&#xff1a;Nacos客户端通过一个定时任务&#xff0c;每6秒从注册中心获取实例列表&…

华为nat64配置

1.前期环境准备 环境拓扑 拓扑分为两个区域,左边为trust区域,使用IPv4地址互访,右边为untrust区域,使用IPv6地址互访 2.接口地址配置 pc1地址配置 pc2地址配置 FW接口配置 (1)首先进入防火墙配置界面 注:防火墙初始账号密码为user:admin,pwd:Admin@123,进入之后…

目标检测之3维合成

现在有一系列的图片&#xff0c;图片之间可以按照z轴方向进行排列。图片经过了目标检测&#xff0c;输出了一系列的检测框&#xff0c;现在的需求是将检测框按类别进行合成&#xff0c;以在3维上生成检测结果。 思路&#xff1a;将图片按照z轴方向排列&#xff0c;以z轴索引作…

机器学习:提取问题答案

模型BERT 任务&#xff1a;提取问题和答案 问题的起始位置和结束位置。 数据集 数据集 DRCDODSQA 先分词&#xff0c;然后tokenize 文章长度是不同的&#xff0c;bert的token的长度有限制&#xff0c;一般是512&#xff0c; self-attention的计算量是 O ( n 2 ) O(n^2) O(n…

Netty学习(三)

文章目录 三. Netty 进阶1. 粘包与半包1.1 粘包现象服务端代码客户端代码 1.2 半包现象服务端代码客户端代码 1.3 现象分析粘包半包缘由滑动窗口MSS 限制Nagle 算法 1.4 解决方案方法1&#xff0c;短链接方法2&#xff0c;固定长度方法3&#xff0c;固定分隔符方法4&#xff0c…

Stable Diffusion 开源模型 SDXL 1.0 发布

关于 SDXL 模型&#xff0c;之前写过两篇&#xff1a; Stable Diffusion即将发布全新版本Stable Diffusion XL 带来哪些新东西&#xff1f; 一晃四个月的时间过去了&#xff0c;Stability AI 团队终于发布了 SDXL 1.0。当然在这中间发布过几个中间版本&#xff0c;分别是 SDXL …

c++ 类

类的引入 c 语言的结构体只能定义变量 但是 c的结构体除了定义变量之外&#xff0c;还可以定义函数。 感受感受&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1//我们声明一个结构体 struct Stack {// c可以把函数写在结构体中//叫成员函数:// 如下&#xff1a;//c的写法&am…

【Git】分支管理-创建切换合并删除分支冲突

文章目录 分支管理创建分支切换分支合并分支删除分支分支冲突 分支管理 在版本库当中有一个head指针&#xff0c;指向master分支。master存储的是最新一次提交的commit id&#xff08;版本号&#xff09; >对应的是版本库当中对象库的一个对象的索引 在版本回退⾥&#xff…

【MySQL 基于Amoeba读写分离】

目录 一、读写分离是什么&#xff1f; 二、常见的MySQL读写分离方案 1.基于程序代码内部实现 2.基于中间代理层实现 3.Amoeba 三、分离步骤 1.在主机Amoeba上安装java环境 2.安装并配置Amoeba 3.配置Amoeba读写分离&#xff0c;两个Slave读负载均衡 4.测试 4.1 在Cl…

大数据Flink(五十三):Flink流处理特性、发展历史以及Flink的优势

文章目录 Flink流处理特性、发展历史以及Flink的优势 一、Flink流处理特性 二、发展历史

javascript数据类型详解

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/front-end-tutorial 】或者公众号【AIShareLab】回复 javascript 也可获取。 文章目录 数据类型数据类型的分类基本数据类型Number数字型进制数字型范围三个特殊值IsNaN () String字符串转义符字符串…

matplotlib绘图中可选标记

文章目录 简介所有可用的绘图标记绘图函数标记绘制 简介 前面的博客简要介绍了matplotlib中的绘图标记&#xff0c;并列举出了部分可用标记点的类型&#xff0c;并画了个图作为示例&#xff0c;如下图下表所示。本文则将所有标记点的类型均绘制一遍 字符类型字符类型字符类型…

C++ | 红黑树以及map与set的封装

目录 前言 一、红黑树 1、红黑树的基本概念 2、红黑树相关特性 3、红黑树结点的定义 4、红黑树的查找 5、红黑树的插入 6、二叉树的拷贝构造与析构 7、红黑树的检测 8、红黑树总结 二、map与set的封装 1、红黑树的结点 2、红黑树迭代器 3、set的封装 4、map的封…

error:0308010C:digital envelope routines::unsupported(Vue2报错)

原因:node.js版本过高&#xff0c; 解决方案&#xff0c;在终端输入以下命令 set NODE_OPTIONS--openssl-legacy-provider 然后再package.json里面添加一行 "dev_t": "set NODE_OPTIONS\"--openssl-legacy-provider\" & npm run dev\n" 然后…

又一个产业即将被中国超越,韩国急了,将提供1.2万亿支持

日前韩媒报道指韩国计划推出1.2万亿韩元的OLED面板产业资助计划&#xff0c;希望帮助韩国两大OLED面板企业三星和LGD巩固OLED面板的技术领先优势&#xff0c;主要是因为它们正面临中国面板厂商的狙击&#xff0c;即将被超越。 据悉韩国推出的1.2万亿韩元资助计划&#xff0c;其…

在EF Core中为数据表按列加密存储

假设有User表 public class User : Entity<int> {public int Id { get; set; }public string UserName { get; set; }public string Name { get; set; }public string IdentificationNumber { get; set; } }其中有身份证号码IdentificationNumber列&#xff0c;需要加密…

计算机网络知识点汇总(持续更新)

文章目录 第一章 概述1.1 计算机网络在信息时代的作用信息服务基础设施我国互联网发展状况 1.2 因特网概述网络、互联网、因特网的基本概述因特网发展的三个阶段因特网的标准化工作 1.3 三种交换方式电路交换分组交换报文交换 1.4 计算机网络的定义和分类定义分类按交换技术按使…