Linux内核崩溃 dump调试

news/2024/4/26 1:05:59/文章来源:https://blog.csdn.net/lnwechag/article/details/129274368

内核-crash(崩溃),oops消息,dump

oops

(也称 panic),称程序运行崩溃,程序崩溃后会产生oops消息。

应用程序或内核线程的崩溃都会产生oops消息,通常发生oops时,系统不会发生死机,而在终端或日志中打印oops信息

内容有PC指针,CPU R0-R15寄存器和堆栈信息,崩溃前函数调用情况等

oops 的格式

  内核的文档里的详细的Oops的说明,的名字是

        Documentation/oops-tracing.txt

        http://www.mjmwired.net/kernel/Documentation/oops-tracing.txt

        Linux Kernel Documentation :: oops-tracing.txt (mjmwired.net)

oops第一段出错是内存page地址,

        例如提示,

        Unable to handle kernel NULL pointer dereference at virtual address 00000000

        往往表示碰到空指针了

第二段出错时是寄存器的快照,不同CPU显示不同情况;

     其中基本上所有CPU都会有的PC寄存器(Program counter register),它保存最后出问题的地址。
      LR保存着函数返回地址。这里就比较容易看出是谁出问题

最重要是第三段,即可出错的调用堆栈(Call Trace).从这里即可推算出错的所在函数

        [ 9054.949421] Call trace:

        [ 9054.951886]  w5500_write_buf+0x15c/0x1ac [w5500_wiz0]

        这告诉我们,w5500_write_buf函数有0x1ac 这么大,而Oops发生在0x15c处

        两个值指得都是汇编代码的值

反汇编定位

        把驱动编译过程文件xxx.o进行反汇编,现在Linux 自带的objdump生成.s文件

        aarch64-linux-objdump -d w5500-wiz0.o > driver.s

        在driver.s文件里找到对应的函数:

        0000000000000a50 <w5500_write_buf>:

        a68: a9b67bfd stp x29, x30, [sp, #-160]!

        ......

        bf8: d65f03c0 ret

        函数的基址为0xa68 出错行需加上偏移 0xa68+0x15c=0xbc4;

定位出错代码行:aarch64-linux-addr2line

          注意:在编译驱动的时候在Makefile中添加参数 “KBUILD_CFLAGS+= -g” 参数,导致使用addr2line工具时无法找到oops具体对应的行

aarch64-linux-addr2line -C -f -e w5500-wiz0.o bc4

w5500_write_buf

/home/forlinx/3568/atms/0_driver/w5500/dev.c:223 (discriminator 3)

coredump

/proc/sys/kernel

  查看系统是否生成 core dump文件

        ulimit -c   返回0表不生成  大于0的数表生成文件大小限制  unlimited表文件大小不受限制

设置core dump文件大小(命令设置是临时的,永久生效

        ulimit -c 0

        ulimit -c 1024

        ulimit -c unlimited

当程序运行过程中异常终止或崩溃时会发生 core dump

用 Core Dump 表示当程序异常终止或崩溃时,将进程此时的内存中的内容拷贝到磁盘文件中存储,以方便编程人员调试

下列出几种信号,它们在发生时会产生 core dump:

Signal

Action

Comment

SIGQUIT

Core

Quit from keyboard

SIGILL

Core

Illegal Instruction

SIGABRT

Core

Abort signal from abort

SIGSEGV

Core

Invalid memory reference

SIGTRAP

Core

Trace/breakpoint trap

当然不仅限于上面的几种信号。这就是为什么我们使用 Ctrl+z 来挂起一个进程或者 Ctrl+C 结束一个进程均不会产生 core dump,因为前者会向进程发出 SIGTSTP 信号,该信号的默认操作为暂停进程(Stop Process);后者会向进程发出SIGINT 信号,该信号默认操作为终止进程(Terminate Process)。同样 kill -9 命令会发出 SIGKILL 命令,该命令默认为终止进程。

而如果我们使用 Ctrl+\ 来终止一个进程,会向进程发出 SIGQUIT 信号,默认是会产生 core dump 的。还有其它情景会产生 core dump, 如:程序调用 abort() 函数、访存错误、非法指令等等。

设置core dump 文件存储路径及命名规则:

默认生成的 core 文件保存在可执行文件所在的目录下,文件名就为 core。

通过修改 /proc/sys/kernel/core_uses_pid 文件可以让生成 core 文件名是否自动加上 pid 号。

生成的 core 文件名将会变成 core.pid,其中 pid 表示该进程的 PID。

[root@atms:/proc/sys/kernel]# echo 1 > core_uses_pid                                                                    

还可以通过修改 /proc/sys/kernel/core_pattern 来控制生成 core 文件保存的位置以及文件名格式。

例如可以用 echo "/tmp/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern 设置生成的 core 文件保存在 “/tmp/corefile” 目录下,文件名格式为 “core-命令名-pid-时间戳”

%% 单个%字符
%p dump进程的进程ID
%u dump进程的用户ID
%g dump进程的组ID
%s 导致core dump的信号
%t core dump 的时间
%h 主机名
%e 程序文件名

[root@atms:/proc/sys/kernel]# ls core*  

core_pattern  core_pipe_limit  core_uses_pid

[root@atms:/proc/sys/kernel]# echo "/tmp/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern

使用 gdb 调试 Core 文件

主机(ubuntu)安装aarch64-linux-gdb

主机默认下只有x86的gdb,没有arm环境下的aarch64-linux-gdb

进入ok3568-linux-source/buildroot/output/OK3568目录下执行make menuconfig 搜索gdb

按1进入build cross gdb for the host 选中即可

返回ok3568-linux-sourc 执行 ./build.sh buildroot 完成后..../OK3568/host/bin 目录下会生成该工具

gdb调试coredump文件

产生了 core 文件,我们该如何使用该 Core 文件进行调试呢?Linux 中可以使用 GDB 来调试 core 文件,步骤如下:

首先,使用 gcc 编译源文件,加上 -g 以增加调试信息;

aarch64-linux-gcc test.c -o test -g

arm板打开 core dump 以使程序异常终止时能生成 core 文件;

        ulimit -c unlimited

        echo 1 > proc/sys/kernel/core_uses_pid

        echo "/tmp/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern

运行程序,当core dump 之后,使用命令 gdb [program] [core] 来查看 core 文件,其中 program 为可执行程序名,core 为生成的 core 文件名。

例:

[root@atms:/mnt/nfs]# ./test_core           

Segmentation fault (core dumped)  程序段错误

[root@atms:/mnt/nfs]# ls /tmp/core*

/tmp/corefile-test_core-15327-1677554939   在设定的tmp目录下生成对应的core 文件

将core 文件拷贝到主机,在主机上执行命令

aarch64-linux-gdb  test_core  corefile-test_core-15327-1677554939

指示出错位置行号及对应的代码;

bt命令,显示函数调用堆栈,显然func函数被main函数调用

 

f 0 或 f 1 命令,打印栈号0或1的堆栈,显示函数是怎么调用另一函数的 f全称 frame

可以看反汇编代码disass,cpu寄存器的值info reg等

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

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

相关文章

中文预训练大模型—文心Ernie技术原理

文心Ernie技术原理 一、背景技术 Ernie是基于Bert模型进行改进&#xff0c;基本模型是Transformer&#xff0c;Bert完成的预训练任务是&#xff1a;完形填空&#xff08;通过基本语言单元掩码&#xff09;&#xff1b;上下句预测。 Bert模型的缺陷是&#xff1a;只能捕获局部…

【Spark分布式内存计算框架——Spark Streaming】9. 获取偏移量 应用案例:百度搜索风云榜(上)

4.4 获取偏移量 当SparkStreaming集成Kafka时&#xff0c;无论是Old Consumer API中Direct方式还是New Consumer API方式获取的数据&#xff0c;每批次的数据封装在KafkaRDD中&#xff0c;其中包含每条数据的元数据信息。 文档&#xff1a;http://spark.apache.org/docs/2.4.…

Linux系统介绍及熟悉Linux基础操作

一、什么是Liunx Linux&#xff0c;全称GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布&#xff0c;它主要受到Minix和Unix思想的启发&am…

【图像处理】数字图像处理基础(分辨率,像素,显示...)

Table of Contents1.数字图像处理基础1.1 图像表示1.1.1 图像成像模型1.1.2 数字图像的表示a.图像采样b.图像灰度的量化c.算比特数1.2 分辨率1.2.1 空间分辨率1.2.2 灰度分辨率1.3 像素间的关系1.3.1 像素邻域a.4邻域b.4对角邻域c.8邻域1.3.2 像素邻接1.3.3 像素连通1.3.4 像素…

“速通“ 老生常谈的HashMap [实现原理源码解读]

&#x1f473;我亲爱的各位大佬们好&#x1f618;&#x1f618;&#x1f618; ♨️本篇文章记录的为 HashMap 实现原理&&源码解读 相关内容&#xff0c;适合在学Java的小白,帮助新手快速上手,也适合复习中&#xff0c;面试中的大佬&#x1f649;&#x1f649;&#x1f…

【Leedcode】栈和队列必备的面试题(第二期)

【Leedcode】栈和队列必备的面试题&#xff08;第二期&#xff09; 文章目录【Leedcode】栈和队列必备的面试题&#xff08;第二期&#xff09;一、题目&#xff08;用两个队列实现栈&#xff09;二、思路图解1.定义两个队列2.初始化两个队列3.往两个队列中放入数据4.两个队列出…

对账平台设计

背景 随着公司业务的蓬勃发展&#xff0c;交易履约清结算业务的复杂性也在不断的增高&#xff0c;资金以及各种数据的一致性和准确性也变得越发重要。 以交易链路为例&#xff0c;存在着如下一些潜在的不一致场景&#xff1a; 订单支付成功了&#xff0c;但是订单状态却还是“…

JVM方法区详解有这篇就够了

1、方法区在哪里《Java虚拟机规范》中明确说明&#xff1a;“尽管所有的方法区在逻辑上是属于堆的一部分&#xff0c;但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotSpotJVM而言&#xff0c;方法区还有一个别名叫做Non-Heap&#xff08;非堆&#xff09…

机械键盘不只有轴体的区别!键帽高度也有些学问

键盘键帽的学问有很多&#xff0c;上篇文章中&#xff0c;笔者和大家聊了键帽的材质和耐油污的问题。 除此之外&#xff0c;键帽的高度和字符的印刷方式也有不同&#xff0c;对于多数机械键盘来说&#xff0c;会发现每一列键帽的倾斜角度都略有不同&#xff0c;使用起来可以减少…

Android TV UI开发常用知识

导入依赖 Google官方为Android TV的UI开发提供了一系列的规范组件&#xff0c;在leanback的依赖库中&#xff0c;这里介绍一些常用的组件&#xff0c;使用前需要导入leanback库。 implementation androidx.leanback:leanback:$version常用的页面 这些Fragment有设计好的样式&…

3.ffmpeg命令行环境搭建、ffmpeg命令行初步了解

在上章,我们讲过: ffmpeg.exe: 主要用于转码或者剪切的应用程序, 也可以从url/现场音频/视频源抓取输入源ffplay.exe: 主要用于播放视频的应用程序,该应用程序源码是开源的,我们后面章节会去源码分析ffprobe.exe: 主要用于分析视频码流的应用程序, 可以获取媒体文件的详细信息,…

【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (3)-触发器详解-翻转窗口 前言 事件触发指的是存储事件&#xff0c;所以在新版的ADF 中&#xff0c;已经明确了是“存储事件”&#xff0c;…

【C语言】结构体进阶

一、结构体 1. 结构体的声明 &#xff08;1&#xff09; 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。&#xff08;2&#xff09;结构的声明 struct tag {member-list; }variable-list;例如描述一个学生&#x…

【SPSS】两配对样本T检验分析详细操作教程(附案例实战)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

RocketMQ的一些使用理解

1.RocketMQ的生产者生产负载策略&#xff08;3种&#xff09; (1)SelectMessageQueueByHash &#xff08;一致性hash&#xff09; (2)SelectMessageQueueByMachineRoom &#xff08;机器随机&#xff09; (3)SelectMessageQueueByRandom &#xff08;随机&#xff09; 第1种一…

VBA之正则表达式(41)-- 快速标记两个星号之后的字符

实例需求&#xff1a;工作表中的数据保存在A列~G列&#xff0c;现需要识别D列中包含超过两个星号的内容&#xff0c;并将第3个星号及其之后的字符设置为红色字体&#xff0c;如图所示。 示例代码如下。 Sub Demo1()Dim objRegExp As ObjectDim objMatch As ObjectDim strMatch…

08 自研or借力(上):集成Gin替换已有核心

我们的框架和这些顶级的框架相比&#xff0c;差了什么呢&#xff1f;如何才能快速地把我们的框架可用性&#xff0c;和这些框架提升到同一个级别&#xff1f;我们做这个框架除了演示每个实现细节&#xff0c;它的优势是什么呢&#xff1f; 不妨带着这些问题&#xff0c;把我们…

ClickHouse的架构与基本概念

一、ClickHouse的定义 ClickHouse是一个完全的列式分布式数据库管理系统(DBMS)&#xff0c;允许在运行时创建表和数据库&#xff0c;加载数据和运行查询&#xff0c;而无需重新配置和重新启动服务器&#xff0c;支持线性扩展&#xff0c;简单方便&#xff0c;高可靠性&#xf…

C++学习笔记-内存空间

考虑这样一种情况&#xff0c;当我们使用相同的名称&#xff0c;叫Zara的两个人在同一个班级。我们需要明确区分它们将不得不使用一些额外的信息&#xff0c;如他们的名字&#xff0c;如他们生活在不同的区域或母亲或父亲的名字等等。 同样的情况也出现在C应用程序中。例如&am…

iphone系统崩溃数据能恢复吗?教你三招方法

最近有些苹果用户反应自己手机的屏幕无法滑动&#xff0c;桌面上APP也无法点开&#xff0c;想要关机重启下试试&#xff0c;可是&#xff0c;连关机都关不了&#xff0c;甚至连Siri都罢工了。苹果手机系统崩溃&#xff0c;出现黑屏、白屏、无限重启之类的故障&#xff0c;导致手…