反汇编快速定位内核OOPS

前言

简单的说,出现内核奔溃,我们可以通过串口日志提供的信息;使用gdb反汇编出问题函数所在的文件,然后使用《disassemble /m 函数名》查看具体函数的源码和汇编码;这样能直观的看到源代码对应的汇编码干了什么;再根据串口日志的寄存器信息,查看当时寄存器的值,就能对上当时的参数,和变量的值

示例1

内核oops信息

这是个wifi驱动的空指针问题,问题出在memcmp函数

<1> [101063.001918] Unable to handle kernel NULL pointer dereference at virtual address 0000012a
<1> [101063.010245] pgd = c0004000
<1> [101063.013081] [0000012a] *pgd=00000000
<0> [101063.016863] Internal error: Oops: 17 [#1] PREEMPT THUMB2
<4> [101063.140418] CPU: 0 PID: 146 Comm: ssv6xxx_hci_rx_ Not tainted 3.10.33 #1
<4> [101063.147250] task: c16f9500 ti: c16f0000 task.ti: c16f0000
<4> [101063.152771] PC is at memcmp+0xa/0x1a
<4> [101063.156553] LR is at ssv_start_xmit+0x1dc/0x410 [ssv6x5x]
<4> [101063.162073] pc : [<c00fb848>]    lr : [<bf815309>]    psr: 80000133
sp : c16f1be8  ip : 00000088  fp : 00000000
<4> [101063.173755] r10: bf8a5498  r9 : c10a4440  r8 : c126c8a4
<4> [101063.179123] r7 : c05f4258  r6 : 0000012a  r5 : 00000100  r4 : c16d0f00
<4> [101063.185741] r3 : 00000000  r2 : 00000006  r1 : c05f4258  r0 : 0000012a
<4> [101063.192390] Flags: Nzcv  IRQs on  FIQs on  Mode SVC_32  ISA Thumb  Segment kernel
<4> [101063.199984] Control: 50c53c7d  Table: 01eb4059  DAC: 00000015

反汇编

根据“LR is at ssv_start_xmit+0x1dc/0x410 [ssv6x5x]”,反汇编该函数所在的.o文件看下

./owtoolchain/linux64/bin/arm-openwrt-linux-uclibcgnueabi-gdb ./build_dir/target-arm_cortex-a7+neon-vfpv4_uClibc-1.0.25_eabi/sv6318pre/src/ssv6x5x.o

可以根据0x1dc定位到保存的返回地址

根据“PC is at memcmp+0xa/0x1a”,反汇编该函数所在的.o文件看下

./owtoolchain/linux64/bin/arm-openwrt-linux-uclibcgnueabi-gdb ./marvell/linux/arch/arm/boot/compressed/string.o

就是取出第一参数R3(根据上图,就是cur->mac_addr)的每个字符做复制到第二份参数;但是r3为0 ,是空指针,所以触发异常

(gdb) disassemble /m memcmp
Dump of assembler code for function memcmp:
69      {0x000000e4 <+2>:     mov     r3, r0    //将第一参数r0,保存在r3中0x000000e6 <+4>:     push    {r4, lr}70              const unsigned char *su1 = cs, *su2 = ct, *end = su1 + count;0x000000e2 <+0>:     add     r2, r071              int res = 0;
72
73              while (su1 < end) {0x000000e8 <+6>:     cmp     r3, r20x000000ea <+8>:     bcs.n   0xfa <memcmp+24>74                      res = *su1++ - *su2++;0x000000ec <+10>:    ldrb.w  r4, [r3], #1     //取出r3的数据放到R4中,r3地址加10x000000f0 <+14>:    ldrb.w  r0, [r1], #175                      if (res)0x000000f4 <+18>:    subs    r0, r4, r00x000000f6 <+20>:    beq.n   0xe8 <memcmp+6>0x000000f8 <+22>:    b.n     0xfc <memcmp+26>0x000000fa <+24>:    movs    r0, #076                              break;
77              }
78              return res;
79      }0x000000fc <+26>:    pop     {r4, pc}End of assembler dump.

示例2

内核oops信息

提示:7265705f这个r1寄存器的地址的页表是空的

<1> [36592.660565] Unable to handle kernel paging request at virtual address 7265705f
<1> [36592.668068] pgd = c0004000
<1> [36592.671362] [7265705f] *pgd=00000000
<0> [36592.680085] Internal error: Oops: 5 [#1] PREEMPT THUMB2
<4> [36592.685301] Modules linked in: mfp iptable_nat nf_nat_ipv4 nf_conntrack_netlink nf_conntrack_ipv4 ebtable_nat ebtable_filter ebtable_broute xt_time xt_tcpudp xt_tcpmss xt_statistic xt_state xt_quota xt_pkttype xt_physdev xt_owner xt_nat xt_multiport xt_mark xt_mac xt_limit xt_length xt_id xt_http xt_hl xt_ecn xt_dscp xt_conntrack xt_comment xt_addrtype xt_TCPMSS xt_REDIRECT xt_LOG xt_HL xt_DSCP xt_CT xt_CLASSIFY nfnetlink nf_nat_tftp nf_nat_irc nf_nat_ftp nf_defrag_ipv4 nf_conntrack_tftp nf_conntrack_irc nf_conntrack_ftp iptable_raw iptable_mangle iptable_filter ipt_REJECT ipt_MASQUERADE ipt_ECN ip_tables ebtables ebt_vlan ebt_stp ebt_snat ebt_redirect ebt_pkttype ebt_mark_m ebt_mark ebt_limit ebt_ip6 ebt_ip ebt_dnat ebt_arpreply ebt_arp ebt_among ebt_802_3 crc_ccitt ip6t_NPT ip6t_MASQUERADE ip6table_nat
<4> [36592.756335]  nf_nat_ipv6 nf_nat ip6t_rt ip6t_frag ip6t_hbh ip6t_eui64 ip6t_mh ip6t_ah ip6t_ipv6header ip6t_REJECT ip6table_raw ip6table_mangle ip6table_filter ip6_tables x_tables nf_conntrack_ipv6 nf_conntrack nf_defrag_ipv6 ipcomp6 xfrm6_tunnel xfrm6_mode_tunnel xfrm6_mode_transport xfrm6_mode_beet esp6 ah6 ipcomp xfrm4_tunnel xfrm4_mode_tunnel xfrm4_mode_transport xfrm4_mode_beet esp4 ah4 ipip ip6_tunnel tunnel6 tunnel4 ip_tunnel af_key xfrm_user xfrm_ipcomp xfrm_algo zram zsmalloc lz4_decompress lz4_compress ssv6x5x button_hotplug
<4> [36592.802268] CPU: 0 PID: 143 Comm: ssv6xxx_hci_rx_ Not tainted 3.10.33 #1
<4> [36592.808947] task: c15e5500 ti: c17d4000 task.ti: c17d4000
<4> [36592.814346] PC is at strcmp+0x4/0x20
<4> [36592.817975] LR is at ssv_rx_handle_msg+0x32/0x88 [ssv6x5x]
<4> [36592.823465] pc : [<c00fb676>]    lr : [<bf812e37>]    psr: 20000133
sp : c17d5e88  ip : 00000000  fp : 00000005
<4> [36592.834933] r10: c16b8000  r9 : c108f446  r8 : c1758440
<4> [36592.840149] r7 : 00000000  r6 : c108f4b2  r5 : c1d54000  r4 : 00000156
<4> [36592.846676] r3 : 00000075  r2 : 00000156  r1 : 7265705f  r0 : bf861f2a
<4> [36592.853202] Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA Thumb  Segment kernel
<4> [36592.860675] Control: 50c53c7d  Table: 01228059  DAC: 00000015

反汇编

PC is at strcmp+0x4/0x20,可以看到就是第二个参数r1的页表是0;第四个字节做的事就是取出r1的数据(第二个参数)放到R0中,r1地址加1,遍历比较两个字符串的各字符

(gdb) disassemble /m strcmp
Dump of assembler code for function strcmp:
82      {0x000000fe <+0>:     mov     r2, r083              unsigned char c1, c2;
84              int res = 0;
85
86              do {
87                      c1 = *cs++;0x00000100 <+2>:     ldrb.w  r3, [r2], #188                      c2 = *ct++;
89                      res = c1 - c2;0x00000104 <+6>:     ldrb.w  r0, [r1], #1   //取出r1的数据(第二个参数)放到R0中,r1地址加190                      if (res)0x00000108 <+10>:    subs    r0, r3, r00x0000010a <+12>:    bne.n   0x110 <strcmp+18>91                              break;
92              } while (c1);0x0000010c <+14>:    cmp     r3, #00x0000010e <+16>:    bne.n   0x100 <strcmp+2>93              return res;
94      }0x00000110 <+18>:    bx      lrEnd of assembler dump.

LR is at ssv_rx_handle_msg+0x32/0x88 [ssv6x5x],可以看到strcmp的第二参数就是SSV_ID2STR(msg->id);证明没对这个参数做判断,直接使用而导致的异常

(gdb) disassemble /m ssv_rx_handle_msg
Dump of assembler code for function ssv_rx_handle_msg:
1050        if (strcmp("unknown", SSV_ID2STR(msg->id)) == 0)0x0001052e <+6>:     ldrh    r4, [r1, #0]0x00010532 <+10>:    lsrs    r7, r4, #100x00010534 <+12>:    cmp     r7, #120x00010536 <+14>:    bhi.n   0x10552 <ssv_rx_handle_msg+42>0x00010538 <+16>:    ldr     r3, [pc, #96]   ; (0x1059c <ssv_rx_handle_msg+116>)0x0001053a <+18>:    ldr.w   r3, [r3, r7, lsl #2]0x0001053e <+22>:    cbz     r3, 0x10552 <ssv_rx_handle_msg+42>0x00010540 <+24>:    ubfx    r2, r4, #0, #100x00010544 <+28>:    ldr.w   r1, [r3, r2, lsl #2]0x00010548 <+32>:    ldr     r3, [pc, #84]   ; (0x105a0 <ssv_rx_handle_msg+120>)0x0001054a <+34>:    cmp     r1, #00x0001054c <+36>:    it      eq0x0001054e <+38>:    moveq   r1, r30x00010550 <+40>:    b.n     0x10554 <ssv_rx_handle_msg+44>0x00010552 <+42>:    ldr     r1, [pc, #76]   ; (0x105a0 <ssv_rx_handle_msg+120>)0x00010554 <+44>:    ldr     r0, [pc, #72]   ; (0x105a0 <ssv_rx_handle_msg+120>)0x00010556 <+46>:    bl      0x10556 <ssv_rx_handle_msg+46>0x0001055a <+50>:    mov     r5, r00x0001055c <+52>:    cbnz    r0, 0x10570 <ssv_rx_handle_msg+72>

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

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

相关文章

大数据基础:数仓架构演变

文章目录 数仓架构演变 一、传统离线大数据架构 二、​​​​​​Lambda架构 三、Kappa架构 四、​​​​​​​​​​​​​​混合架构 五、湖仓一体架构 六、流批一体架构 数仓架构演变 20世纪70年代&#xff0c;MIT(麻省理工)的研究员致力于研究一种优化的技术架构&…

海明码的基本原理

海明码 一、什么是海明码二、校验位的分布方式1、奇偶校验2、海明码校验位 三、检错原理四、纠错原理 一、什么是海明码 首先来看一下百度的介绍&#xff1a; ‌‌海明码&#xff08;‌Hamming Code&#xff09;‌是一种具有检错和纠错能力的编码方式&#xff0c;由‌理查德汉…

下载(win10-win11)微软官方ISO镜像方法

下载Win11安装镜像。 官方下载win10地址&#xff1a;下载 Windows 10 官方下载win11地址&#xff1a;Download Windows 11 下载完成后&#xff0c;运行 MediaCreationTool_Win11_23H2.exe 等待完成100%跳转页面后&#xff0c;关闭界面即可。

IDEA工具设置默认使用maven的settings.xml文件

第一步&#xff1a;打开idea工具&#xff0c;选中 File ——> New Projects Setup ——> Settings for New Projects 第二步&#xff1a;先设置下自动构建项目这个选项 第三步&#xff1a;选中 Build Tools ——> Maven&#xff0c;让后就可以设置自己安转的maven和se…

鸿蒙开发5.0【基于CameraKit,通过avrecorder进行录像】

1 场景描述 录像是相机应用的最重要功能之一&#xff0c;录像是循环帧的捕获。本文通过CameraKit自定义相机并通过avrecorder进行录像。 2 效果图 3 自定义相机录像流程图 4 方案描述 4.1 整体描述&#xff1a; 总体可分为:1、相机输入&#xff0c;2、同时输出预览流录像流…

探索全球设计灵感:六大海外设计平台

海外设计网站对于设计师而言&#xff0c;不仅是灵感的源泉&#xff0c;更是专业成长的加速器。这些平台聚集了全球创意人士&#xff0c;提供了一个分享和发现最新设计趋势的环境。设计师可以通过这些网站学习行业内的创新技术&#xff0c;参与设计挑战&#xff0c;提升个人设计…

基于Python的顾客购物数据可视化分析

数据可视化分析实验 数据集简介 本文在实验中考虑到实验使用设备的性能和环境的局限性&#xff0c;采用了kaggle官网上的的消费者购物数据集&#xff0c;数据地址&#xff1a; https://www.kaggle.com/datasets/iamsouravbanerjee/customer-shopping-trends-dataset。 此数据…

Stable Diffusion AI绘画工具的安装与配置(MAC用户)

AI绘画的热潮席卷了整个创意行业&#xff0c;Stable Diffusion作为其中的翘楚&#xff0c;让艺术创作变得前所未有的简单。然而&#xff0c;对于使用Mac电脑用户来说&#xff0c;安装和配置Stable Diffusion可能显得有些棘手。别担心&#xff0c;这份详细的教程将手把手教你如何…

多功能秒达工具箱全开源源码,可自部署且完全开源的中文工具箱

简介&#xff1a; 多功能秒达开源工具箱源码&#xff0c;&#xff0c;可自部署且完全开源的中文工具箱&#xff0c;永远的自由软件&#xff0c;轻量级运行&#xff0c;全平台支持&#xff08;包括ARMv8&#xff09;&#xff0c;完全类似 GPT 的支持&#xff0c;与高效的 UI 高…

【Java】—— Java面向对象基础:编程实例(学生信息管理)

目录 场景描述 定义学生类 创建学生对象并处理需求 代码解析 总结 在Java中&#xff0c;面向对象编程&#xff08;OOP&#xff09;是一种常用的编程范式&#xff0c;它允许我们创建基于现实世界的模型&#xff0c;通过类和对象来模拟这些模型。今天&#xff0c;我们将通过…

刘海屏的优雅回归?华为Mate 70 Pro定义新美学

在智能手机的发展历程中&#xff0c;华为Mate系列一直是高端旗舰的代表。而今&#xff0c;华为Mate 70 Pro的神秘面纱终于揭开&#xff0c;其回归的刘海屏设计和独特的寰宇舷窗设计&#xff0c;再次将华为的设计理念推向了新的高度。 刘海屏的回归&#xff1a;经典与创新的融合…

后端微服务与分布式系统

编写一篇关于后端微服务和分布式系统的文档&#xff0c;需要详细讨论微服务架构的核心概念、优缺点、关键技术&#xff0c;以及在分布式系统中的应用。以下是文档的大纲和内容概述&#xff1a; 后端微服务与分布式系统 1. 简介 微服务架构是一种将大型应用程序分解为一系列小…

【AI绘画】Midjourney前置/imagine与单图指令详解

文章目录 &#x1f4af;Midjourney前置指令/imagine什么是前置指令&#xff1f;/imaginepromptUpscale(放大)Variations&#xff08;变化&#xff09;&#x1f504;&#xff08;重新生成一组图片&#xff09; &#x1f4af;单张图片指令Upscale (细节优化)Vary&#xff08;变体…

COMSOL工业碱性电解槽(3D、双欧拉模型)

本案例通过改写COMSOL官方案例获得&#xff0c;使用了碱性电解槽和欧拉-欧拉&#xff08;湍流&#xff09;模型&#xff0c;阳极室和阴极室带有乳突状的结构&#xff0c;模型进行了人为缩小&#xff0c;仅供参考。其中一些参数可参考如下链接文章的说明。COMSOL碱性电解槽参数解…

public继承

三种继承的方法:public 继承/private继承/protected继承详解及区别_public继承-CSDN博客 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时&#xff0c;它们都保持原有的状态&#xff0c;而基类的私有成员仍然是私有的&#xff0c;不能被基类的子类所访问。 错误…

关键点检测——HRNet原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

Windows上安装 nodejs,npm 和 yarn详细教程

1、下载Node.js 访问Node.js 官网下载&#xff0c;下载需要版本版本&#xff0c;具体操作如下 2、安装Node.js 具体安装可参考以下知乎教程 https://www.zhihu.com/question/591831850/answer/3423661990 3、配置淘宝镜像 npm config set registry https://registry.npmmirror…

UWB Tag钥匙防丢器,精准定位测距,一键找回!告别钥匙遗失焦虑

在这个快节奏的时代&#xff0c;我们每天穿梭于家、办公室、商场之间&#xff0c;手中的钥匙串仿佛成了连接生活各个角落的纽带。但你是否也曾有过这样的经历&#xff1a;匆忙间&#xff0c;那串沉甸甸的钥匙似乎在某个不经意的瞬间与你“不辞而别”&#xff0c;留下的是无尽的…

如何将本地jar包导入到maven仓库中

需要将本地的 JAR 包安装到你的本地 Maven 仓库中&#xff0c;可以使用 mvn install:install-file 命令来完成这一步。 1.打开终端或命令行 2.运行以下命令&#xff0c;将 JAR 文件安装到本地 Maven 仓库&#xff1a; mvn install:install-file -Dfilepath/to/your/com.magu…

APP.vue引入子组件进行页面展示

一.将vue项目启动服务器原始页面进行清空 打开APP.vue文件&#xff0c;将<template>标签里的内容和<style>标签里的内容 ctrl/ 选中进行注释&#xff0c;以及引入的Helloworld.vue文件内容代码进行注释 并且 ctrls 保存 服务器页面从原始页面 变为空白 二.在comp…