37 coredump 的生成和使用

news/2024/4/26 4:47:02/文章来源:https://blog.csdn.net/u011039332/article/details/128335098

前言

呵呵 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   %rbp0x0000000000400537 <+1>:	mov    %rsp,%rbp0x000000000040053a <+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),%edx0x0000000000400552 <+28>:	mov    -0x8(%rbp),%eax0x0000000000400555 <+31>:	add    %edx,%eax0x0000000000400557 <+33>:	mov    %eax,-0x4(%rbp)0x000000000040055a <+36>:	mov    -0x4(%rbp),%eax0x000000000040055d <+39>:	mov    $0x0,%ecx0x0000000000400562 <+44>:	cltd   
=> 0x0000000000400563 <+45>:	idiv   %ecx0x0000000000400565 <+47>:	mov    %al,-0xd(%rbp)0x0000000000400568 <+50>:	mov    $0x0,%eax0x000000000040056d <+55>:	pop    %rbp0x000000000040056e <+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   %rbp0x0000000000400537 <+1>:	mov    %rsp,%rbp0x000000000040053a <+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),%edx0x0000000000400552 <+28>:	mov    -0x10(%rbp),%eax0x0000000000400555 <+31>:	add    %edx,%eax0x0000000000400557 <+33>:	mov    %eax,-0xc(%rbp)0x000000000040055a <+36>:	mov    -0xc(%rbp),%eax0x000000000040055d <+39>:	cltq   0x000000000040055f <+41>:	mov    %rax,-0x8(%rbp)0x0000000000400563 <+45>:	mov    -0x8(%rbp),%rax
=> 0x0000000000400567 <+49>:	movzbl (%rax),%eax0x000000000040056a <+52>:	mov    %al,-0x15(%rbp)0x000000000040056d <+55>:	mov    $0x0,%eax0x0000000000400572 <+60>:	pop    %rbp0x0000000000400573 <+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.luyixian.cn/news_show_337140.aspx

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

相关文章

【TypeScript】TS入门级基础学习(一)

【TypeScript】TS入门级基础学习&#xff08;一&#xff09; 一、前言 TypeScript 是一种用于应用程序规模的 JavaScript 语言。 TypeScript 向 JavaScript 添加了可选类型&#xff0c;支持用于任何浏览器、任何主机、任何操作系统的大规模 JavaScript 应用程序的工具。 Type…

Spark(37):Streaming DataFrame 和 Streaming DataSet 创建

目录 0. 相关文章链接 1. 概述 2. socket source 3. file source 3.1. 读取普通文件夹内的文件 3.2. 读取自动分区的文件夹内的文件 4. kafka source 4.1. 导入依赖 4.2. 以 Streaming 模式创建 Kafka 工作流 4.3. 通过 Batch 模式创建 Kafka 工作流 5. Rate Source…

2023牛客暑期多校-J-Qu‘est-ce Que C‘est?(DP)

题意&#xff1a; 给定长度为n的数列,要求每个数都在的范围&#xff0c;且任意长度大于等于2的区间和都大于等于0&#xff0c;问方案数。。 思路&#xff1a; 首先要看出是dp题&#xff0c;用来表示遍历到第i位且后缀和最小为x的可行方案数&#xff08;此时的后缀可以只有最…

Java 版 spring cloud +spring boot 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

linux下nginx的安装和使用

文章目录 &#x1f4d2;安装nginx正常使用nginx包安装1️⃣上传到对应目录2️⃣解压nginx3️⃣检查是否启动成功 使用docker安装nginx &#x1f4d2;使用nginx1️⃣简单的反向代理2️⃣介绍location配置中root和alias的区别 &#x1f4d2;安装nginx 正常使用nginx包安装 官网…

BLE基础理论/Android BLE开发示例

参考&#xff1a;https://blog.csdn.net/qq_36075612/article/details/127739150?spm1001.2014.3001.5502 参考&#xff1a; https://blog.csdn.net/qq_36075612/article/details/122772966?spm1001.2014.3001.5502 目录 蓝牙的分类传统蓝牙低功耗蓝牙 蓝牙专业词汇&#xff…

SpringAOP的相关概念

文章目录 一.什么是AOP二.AOP的组成部分三.SpringAOP的实现3.1 增加SpringAOP依赖3.2 创建切面3.2 创建切点3.3 创建通知3.4 创建连接点 四.SpringAOP的实现原理4.1 JDK动态代理4.2 CGLIB 动态代理总结 一.什么是AOP AOP&#xff0c;全称为Aspect-Oriented Programming&#x…

解决 tensorflow 出现的 ImportError: Could not find the DLL(s) ‘msvcp140_1.dll‘. 问题

在安装完tensorflow库后出现 问题详述&#xff1a; ImportError: Could not find the DLL(s) msvcp140_1.dll. TensorFlow requires that these DLLs be installed in a directory that is named in your %PATH% environment variable. You may install these DLLs by downlo…

新零售行业如何做会员管理和会员营销

蚓链数字化营销系统全渠道会员管理解决方案&#xff0c;线上线下统一管理&#xff0c;打造私域流量&#xff0c;微信、门店会员全渠道管理&#xff0c;打通私域流量池&#xff0c;实现裂变营销&#xff1a; 开启新零售之路&#xff0c;必然要摒弃原有的管理模式&#xff0c;大…

郑州多域名https证书

多域名https证书是https证书中比较特殊的一款&#xff0c;它保护的域名记录是众多https证书中最灵活的。不管是DV基础型的多域名https证书还是OV企业型和EV增强型的多域名https证书既可以保护多个主域名或者子域名&#xff0c;还可以主域名子域名随意组合&#xff0c;只要申请者…

【动态规划part11】| 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

目录 &#x1f388;LeetCode123.买卖股票的最佳时机III &#x1f388;LeetCode188.买卖股票的最佳时机IV &#x1f388;LeetCode123.买卖股票的最佳时机III 链接&#xff1a;123.买卖股票的最佳时机III 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i…

无涯教程-jQuery - Pulsate方法函数

Pulsate 效果可以与effect()方法一起使用。这会使元素的不透明性产生多次脉冲。 Pulsate - 语法 selector.effect( "pulsate", {arguments}, speed ); 这是所有参数的描述- times - 脉动的时间。默认值为3。model - 效果的模式。可以是"显示(show)"&a…

基于Java+SpringBoot+vue前后端分离技术交流和分享平台设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Moke 一百万条 Mysql 的数据

文章目录 前言创建数据库创建表结构生成数据 前言 想研究一下&#xff0c;数据量大的情况下&#xff0c;如何优化前端分页&#xff0c;所以需要 Moke 一些数据 创建数据库 在 Mysql的基础上&#xff0c;可以写个语句执行 CREATE DATABASE test_oneMillion; USE test_oneMi…

JAVA SE -- 第十一天

&#xff08;全部来自“韩顺平教育”&#xff09; 异常-Exception 一、异常介绍 1、基本介绍 Java语言中&#xff0c;将程序执行中发生的不正常情况为“异常”&#xff08;开发过程中的语法错误和逻辑错误不是异常&#xff09; 2、执行过程中发生的异常事件可分为两大类 …

Reinforcement Learning with Code 【Chapter 9. Policy Gradient Methods】

Reinforcement Learning with Code This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation of Reinforcement Learning, . 文章…

opencv+ffmpeg环境(ubuntu)搭建全面详解

一.先讲讲opencv和ffmpeg之间的关系 1.1它们之间的联系 我们知道opencv主要是用来做图像处理的&#xff0c;但也包含视频解码的功能&#xff0c;而在视频解码部分的功能opencv是使用了ffmpeg。所以它们都是可以处理图像和视频的编解码&#xff0c;我个人感觉两个的侧重点不一…

SpringBoot项目部署(前后端分离、Linux部署项目)

一、架构 部署环境说明&#xff1a; 192.168.122.100(服务器A)&#xff1a; Nginx&#xff1a;部署前端项目、配置反向代理 Mysql&#xff1a;主从复制结构中的主库 192.168.122.131 (服务器B)&#xff1a; jdk: 运行Java项目 git:版本控制工具 (从gitee中拉取源码) maven:…

数据结构:快速的Redis有哪些慢操作?

redis 为什么要这莫快&#xff1f;一个就是他是基于内存的&#xff0c;另外一个就是他是他的数据结构 说到这儿&#xff0c;你肯定会说&#xff1a;“这个我知道&#xff0c;不就是 String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、 Hash&#xff08…

【SpringCloud Alibaba】(五)服务雪崩与容错方案

在前面的文章中&#xff0c;我们实现了用户微服务、商品微服务和订单微服务之间的远程调用&#xff0c;并且实现了服务调用的负载均衡。 但是&#xff0c;现在系统中存在着一个很明显的问题&#xff1a;那就是如果系统的并发量上来后&#xff0c;系统并没有容错的能力&#xf…