【Linux】coredump 文件的例子分析

1. 生成 core 文件

  • 网上很多教程,我这里举一种
  1. 临时开启 生成 core 文件
# 0 就是没有开 coredump 功能
root@swd-Lenovo-G40-80:/home/swd/pros/c--learn/0.test_codes/demos# ulimit -c
0
# 设置值临时为 unlimited
root@swd-Lenovo-G40-80:/home/swd/pros/c--learn/0.test_codes/demos# ulimit -c unlimited
# 检查值为 unlimited
root@swd-Lenovo-G40-80:/home/swd/pros/c--learn/0.test_codes/demos# ulimit -c
unlimited
# 可以看到下面的字段 core file size 的值为 unlimited
root@swd-Lenovo-G40-80:/home/swd/pros/c--learn/0.test_codes/demos# ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31282
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 31282
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
  1. 修改保存的文件位置
vim /etc/sysctl.conf# 添加下面两行kernel.core_pattern=/var/core/core_%e_%p
kernel.core_uses_pid=0# 使修改生效
sysctl -p /etc/sysctl.conf# 创建文件夹 /var/core
mkdir -p /var/core

2. 创建一个例子

// demo1.cc 
#include <iostream>
using namespace std;int main()
{int *p = nullptr;cout << *p << endl;return 0;
}
  1. 编译、运行,会报 (core dumped)
g++ -o demo1 demo1.cc
./demo1
Segmentation fault (core dumped)
  1. 查看生成的 core_dump 文件:
# 拷到当前目录
cp /var/core/core_demo1_5392 .
# 查看文件
ls
core_demo1_5392   demo1  demo1.cc 
  1. 使用 gdb 分析,可以看到直接报 Segmentation fault
gdb demo1 core_demo1_5392
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from demo1...(no debugging symbols found)...done.
[New LWP 5392]
Core was generated by `./demo1'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00005555a0b4089e in main ()
(gdb) 
  1. 分析:
    可以看到,#0 0x00005555a0b4089e in main ()指出,是在 main 函数的地址 0x00005555a0b4089e 出现错误。

  2. 继续分析:

# 使用 bt (back trace 回溯),看到是上面的问题
(gdb) bt
#0  0x00005555a0b4089e in main ()
# 使用 disassemble  地址, +line 命令,查看报错的上下文,看到箭头 => 就是出错的地方, => 0x00005555a0b4089e <main+20>:        mov    (%rax),%eax
(gdb) disassemble 0x00005555a0b40890, +60
Dump of assembler code from 0x5555a0b40890 to 0x5555a0b408cc:0x00005555a0b40890 <main+6>: in     (%dx),%al0x00005555a0b40891 <main+7>: adc    %cl,-0x39(%rax)0x00005555a0b40894 <main+10>:        rex.RB clc 0x00005555a0b40896 <main+12>:        add    %al,(%rax)0x00005555a0b40898 <main+14>:        add    %al,(%rax)0x00005555a0b4089a <main+16>:        mov    -0x8(%rbp),%rax
=> 0x00005555a0b4089e <main+20>:        mov    (%rax),%eax0x00005555a0b408a0 <main+22>:        mov    %eax,%esi0x00005555a0b408a2 <main+24>:        lea    0x200777(%rip),%rdi        # 0x5555a0d41020 <_ZSt4cout@@GLIBCXX_3.4>0x00005555a0b408a9 <main+31>:        callq  0x5555a0b40760 <_ZNSolsEi@plt>0x00005555a0b408ae <main+36>:        mov    %rax,%rdx0x00005555a0b408b1 <main+39>:        mov    0x200718(%rip),%rax        # 0x5555a0d40fd00x00005555a0b408b8 <main+46>:        mov    %rax,%rsi0x00005555a0b408bb <main+49>:        mov    %rdx,%rdi0x00005555a0b408be <main+52>:        callq  0x5555a0b40740 <_ZNSolsEPFRSoS_E@plt>0x00005555a0b408c3 <main+57>:        mov    $0x0,%eax0x00005555a0b408c8 <main+62>:        leaveq 0x00005555a0b408c9 <main+63>:        retq   0x00005555a0b408ca <_Z41__static_initialization_and_destruction_0ii+0>:      push   %rbp0x00005555a0b408cb <_Z41__static_initialization_and_destruction_0ii+1>:      mov    %rsp,%rbp
End of assembler dump.
# 使用 info reg 查看寄存器的值,可以看到 rax 的值是 0,mov    (%rax),%eax 汇编指的是 对 rax 存的地址进行取值,rax 是 0 即空指针,所以这是踩空指针。
(gdb) info reg
rax            0x0      0
rbx            0x0      0
rcx            0xa0     160
rdx            0x7ffdd25abf58   140728132616024
rsi            0x7ffdd25abf48   140728132616008
rdi            0x1      1
rbp            0x7ffdd25abe60   0x7ffdd25abe60
rsp            0x7ffdd25abe50   0x7ffdd25abe50
r8             0x7f5f3311bd80   140046855421312
r9             0x0      0
r10            0x6      6
r11            0x7f5f3324af30   140046856662832
r12            0x5555a0b40780   93826256734080
r13            0x7ffdd25abf40   140728132616000
r14            0x0      0
r15            0x0      0
rip            0x5555a0b4089e   0x5555a0b4089e <main+20>
eflags         0x10206  [ PF IF RF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
gs             0x0      0
(gdb) 

分析看上面的 # 注释

  1. 对源程序进行反汇编
objdump -s -d demo1 > demo1.S
  1. demo1.S 的重要部分,我们看到上面 gdb 出来的结果:出错的语句在0x00005555a0b4089e <main+20>: mov (%rax),%eax
    我们没看到0x00005555a0b4089e,但是看到了 <main+20>,我们看到反汇编出来的 main0x000000000000088a ,将它的位置偏移 20
    得到:0x89e 所以得到: 89e: 8b 00 mov (%rax),%eax
0000000000000880 <frame_dummy>:880:	55                   	push   %rbp881:	48 89 e5             	mov    %rsp,%rbp884:	5d                   	pop    %rbp885:	e9 66 ff ff ff       	jmpq   7f0 <register_tm_clones>000000000000088a <main>:88a:	55                   	push   %rbp88b:	48 89 e5             	mov    %rsp,%rbp88e:	48 83 ec 10          	sub    $0x10,%rsp892:	48 c7 45 f8 00 00 00 	movq   $0x0,-0x8(%rbp)899:	00 89a:	48 8b 45 f8          	mov    -0x8(%rbp),%rax	89e:	8b 00                	mov    (%rax),%eax    // 也就是这一行,可以看出它的形式跟 gdb 分析出来的也是一样的8a0:	89 c6                	mov    %eax,%esi8a2:	48 8d 3d 77 07 20 00 	lea    0x200777(%rip),%rdi        # 201020 <_ZSt4cout@@GLIBCXX_3.4>8a9:	e8 b2 fe ff ff       	callq  760 <_ZNSolsEi@plt>8ae:	48 89 c2             	mov    %rax,%rdx8b1:	48 8b 05 18 07 20 00 	mov    0x200718(%rip),%rax        # 200fd0 <_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GLIBCXX_3.4>8b8:	48 89 c6             	mov    %rax,%rsi8bb:	48 89 d7             	mov    %rdx,%rdi8be:	e8 7d fe ff ff       	callq  740 <_ZNSolsEPFRSoS_E@plt>8c3:	b8 00 00 00 00       	mov    $0x0,%eax8c8:	c9                   	leaveq 8c9:	c3                   	retq   

根据汇编,如果熟悉,可以直接定位到代码,如果不熟,那么从上面基本可以定位到是哪个函数,可以加汇编标记定位语句

#include <iostream>
using namespace std;int main()
{// 添加特殊的数字 $0x11111111 这个用不到的数字作为标记,记录是在第几行__asm__("sub $0x11111111,%rsp");int *p = nullptr;__asm__("sub $0x22222222,%rsp");cout << *p << endl;__asm__("sub $0x33333333,%rsp");return 0;
}

重新编译得到的汇编如下,可以看到刚刚那行出问题的那一行,看到在 $0x22222222$0x33333333 之间:

0000000000000880 <frame_dummy>:880:	55                   	push   %rbp881:	48 89 e5             	mov    %rsp,%rbp884:	5d                   	pop    %rbp885:	e9 66 ff ff ff       	jmpq   7f0 <register_tm_clones>000000000000088a <main>:88a:	55                   	push   %rbp88b:	48 89 e5             	mov    %rsp,%rbp88e:	48 83 ec 10          	sub    $0x10,%rsp892:	48 81 ec 11 11 11 11 	sub    $0x11111111,%rsp899:	48 c7 45 f8 00 00 00 	movq   $0x0,-0x8(%rbp)8a0:	00 8a1:	48 81 ec 22 22 22 22 	sub    $0x22222222,%rsp8a8:	48 8b 45 f8          	mov    -0x8(%rbp),%rax8ac:	8b 00                	mov    (%rax),%eax		// 这是刚刚那行出问题的那一行,看到在 $0x22222222 和 $0x33333333 之间8ae:	89 c6                	mov    %eax,%esi8b0:	48 8d 3d 69 07 20 00 	lea    0x200769(%rip),%rdi        # 201020 <_ZSt4cout@@GLIBCXX_3.4>8b7:	e8 a4 fe ff ff       	callq  760 <_ZNSolsEi@plt>8bc:	48 89 c2             	mov    %rax,%rdx8bf:	48 8b 05 0a 07 20 00 	mov    0x20070a(%rip),%rax        # 200fd0 <_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GLIBCXX_3.4>8c6:	48 89 c6             	mov    %rax,%rsi8c9:	48 89 d7             	mov    %rdx,%rdi8cc:	e8 6f fe ff ff       	callq  740 <_ZNSolsEPFRSoS_E@plt>8d1:	48 81 ec 33 33 33 33 	sub    $0x33333333,%rsp8d8:	b8 00 00 00 00       	mov    $0x0,%eax8dd:	c9                   	leaveq 8de:	c3                   	retq   

对应代码就可以清晰得出,然后就可以进行分析。

	__asm__("sub $0x22222222,%rsp");cout << *p << endl;   // 就是这一行出了问题__asm__("sub $0x33333333,%rsp");

3. 加 -g 的debug

#include <iostream>
using namespace std;int main()
{int *p = nullptr;cout << *p << endl;return 0;
}
  • 省去了所有的步骤,直接告诉你是第几行出错!!!!
oot@swd-Lenovo-G40-80:/home/swd/pros/c--learn/0.test_codes/demos# g++ -o demo1 demo1.cc -g
root@swd-Lenovo-G40-80:/home/swd/pros/c--learn/0.test_codes/demos# ./demo1 
Segmentation fault (core dumped)
root@swd-Lenovo-G40-80:/home/swd/pros/c--learn/0.test_codes/demos# cp /var/core/core_demo1_6898 .
root@swd-Lenovo-G40-80:/home/swd/pros/c--learn/0.test_codes/demos# gdb demo1 core_demo1_6898 
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from demo1...done.
[New LWP 6898]
Core was generated by `./demo1'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x000055e6d02ce89e in main () at demo1.cc:9
9           cout << *p << endl;
(gdb) 

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

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

相关文章

Java基础之常用类

Java基础之常用类 一、包装类1.1、Java基本数据类型及其对应的包装类1.2、包装类的自动装箱、自动拆箱机制1.3、包装类的优点 二、String类三、StringBuffer类和StringBuilder类3.1、主要区别&#xff1a;3.2、StringBuffer/StringBuilder用法(两者用法一致) 四、日期类4.1、Da…

setLineWrapMode 是 QTextEdit 类的成员函数,用于设置文本换行模式(Line Wrap Mode)

setLineWrapMode 是 QTextEdit 类的成员函数&#xff0c;用于设置文本换行模式&#xff08;Line Wrap Mode&#xff09;。 在 Qt 中&#xff0c;文本换行模式指定了文本编辑器中长行文本的显示方式。通过设置不同的换行模式&#xff0c;可以控制是否自动换行、如何换行以及是否…

[DASCTF 2023 0X401七月暑期挑战赛] web刷题记录

文章目录 EzFlask方法一 python原型链污染方法二 flask框架静态文件方法三 pin码计算 MyPicDisk方法一 字符串拼接执行命令方法二 phar反序列化 ez_cms EzFlask 考点&#xff1a;python原型链污染、flask框架理解、pin码计算 源码如下 import uuidfrom flask import Flask, re…

企业源代码防泄密的有什么痛点及难点?

安秉信息作为源代码防泄密的方案的提供商&#xff0c;对企业源代码防泄密有深入的了解。在企业中可以对普通 的文件&#xff0c;图纸进行加密保护这些文件的泄漏。但是企业管理者对于企业的源代码文件防泄密却没有更好的管理方案。 源代码防泄密最大的痛点是&#xff0c;现在企…

近五年—中国十大科技进展(2018年—2022年)

近五年—中国十大科技进展&#xff08;2018-2022&#xff09; 2022年中国十大科技进展1. 中国天眼FAST取得系列重要进展2. 中国空间站完成在轨建造并取得一系列重大进展3. 我国科学家发现玉米和水稻增产关键基因4. 科学家首次发现并证实玻色子奇异金属5. 我国科学家将二氧化碳人…

uni-app 微信小程序 pdf预览

<div click"getPDF">查看体检报告</div>getPDF() {uni.downloadFile({url: ${this.$baseURL}/file/download?id${this.pdfFileId},//编写在线的pdf地址success: function(res) {const filePath res.tempFilePath;uni.openDocument({filePath: filePath…

java stream流map和flatmap的区别

map和flatmap都是用来转换操作。 map()操作后的流与原始流的元素个数一一对应&#xff0c;一对一地进行元素转换&#xff0c;适用于对每个元素进行简单的转换操作&#xff0c;例如将元素的属性提取出来或进行数值计算。 flatMap()操作是一对多的元素转换&#xff0c;对于每个输…

Roll-A-Ball 游戏

Roll-A-Ball 游戏 1&#xff09;学习资料 b站视频教程&#xff1a;https://www.bilibili.com/video/BV18W411671S/文档&#xff1a; * Roll-A-Ball 教程&#xff08;一)&#xff0c; * Roll-A-Ball 教程&#xff08;二)线上体验roll-a-ball成品 * http://www-personal.umich.e…

使用opencv将sRGB格式的图片转换为BT.2020格式【sRGB】【BT.2020】

将sRGB格式的图片转换为BT.2020格式涉及到两个步骤&#xff1a;首先将sRGB转换到线性RGB&#xff0c;然后将线性RGB转换到BT.2020。这是因为sRGB图像通常使用伽马校正&#xff0c;而BT.2020工作在线性色彩空间中。 从sRGB到线性RGB&#xff1a;sRGB图像首先需要进行伽马校正解码…

Spring面向切面编程(AOP);Spring控制反转(IOC);解释一下Spring AOP里面的几个名词;Spring 的 IoC支持哪些功能

文章目录 Spring面向切面编程(AOP)什么是AOPSpring AOP and AspectJ AOP 的区别&#xff1f;Spring AOP中的动态代理如何理解 Spring 中的代理&#xff1f;解释一下Spring AOP里面的几个名词Spring在运行时通知对象Spring切面可以应用5种类型的通知&#xff1a;什么是切面 Aspe…

scoop bucket qq脚本分析(qq绿色安装包制作)

url字段 以qq.json为例&#xff0c;其对应的scoop配置文件在$env:scoop\buckets\extras\bucket\qq.json 其中的url字段 "url":"https://webcdn.m.qq.com/spcmgr/download/QQ9.7.17.29230.exe#/dl.7z"为qq安装包下载地址&#xff0c;后缀#/dl.7z为自行添加…

第八节HarmonyOS @Component自定义组件的生命周期

在开始之前&#xff0c;我们先明确自定义组件和页面的关系&#xff1a; 1、自定义组件&#xff1a;Component装饰的UI单元&#xff0c;可以组合多个系统组件实现UI的复用。 2、页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;Entry装饰的自定…

函数递归所应满足的条件

1.递归的概念 递归是学习C语⾔函数绕不开的⼀个话题&#xff0c;那什么是递归呢&#xff1f; 递归其实是⼀种解决问题的⽅法&#xff0c;在C语⾔中&#xff0c;递归就是函数⾃⼰调⽤⾃⼰。 递归的思想&#xff1a; 把⼀个⼤型复杂问题层层转化为⼀个与原问题相似&#xff0c;但…

ArkUI开发进阶—@Builder函数@BuilderParam装饰器的妙用与场景应用【鸿蒙专栏-05】

ArkUI开发进阶—@Builder函数@BuilderParam装饰器的妙用与场景应用 HarmonyOS,作为一款全场景分布式操作系统,为了推动更广泛的应用开发,采用了一种先进而灵活的编程语言——ArkTS。ArkTS是在TypeScript(TS)的基础上发展而来,为HarmonyOS提供了丰富的应用开发工具,使开…

mybatis <include refid=“xxx“></include>

&#xff1c;include refid"xxx"&#xff1e;&#xff1c;/include&#xff1e;使用在查询字段&#xff0c;多个select查询语句&#xff0c;可能查询的字段是相同的&#xff0c;就可以用这个标签把需要查询的字段抽出来。 <sql id"org_id">id,code,…

判断数组里面的元素是否都为某个数——C++ 算法库(std::all_of)

函数功能:检测表达式是否对范围[first, last)中所有元素都返回true,如果都满足,则返回true。 该函数对整个数组元素进行操作,可以节省运行循环来逐一检查每个元素的时间。 它检查每个元素上的给定属性,并在范围内的每个元素满足指定属性时返回 true,否则返回 false。 语…

【LeetCode】203. 移除链表元素

203. 移除链表元素 难度&#xff1a;简单 题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff…

Golang与MongoDB的完美组合

引言 在现代开发中&#xff0c;数据存储是一个至关重要的环节。随着数据量的增加和复杂性的提高&#xff0c;开发人员需要寻找一种高效、可扩展且易于使用的数据库解决方案。MongoDB作为一种NoSQL数据库&#xff0c;提供了强大的功能和灵活的数据模型&#xff0c;与Golang的高…

创建一个带有背景图层和前景图层的渲染窗口

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example demo解决问题&#xff1a; 创建一个带有背景图层和前景图层的渲染窗口&#xff0c;知识点&#xff1a;1. 画布转image&#xff1b;2. 渲染图层设置&#xff1b;3.…

LeetCode算法题解(动态规划,股票买卖)|LeetCode121. 买卖股票的最佳时机、LeetCode122. 买卖股票的最佳时机 II

一、LeetCode121. 买卖股票的最佳时机 题目链接&#xff1a;121. 买卖股票的最佳时机 题目描述&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一…