Android15 GKI版本分析Kernel Crash问题

环境介绍

  • 编译主机:amd64 + Ubuntu 22.04
  • Android源码:Android15 GKI
  • Kernel版本:Linux 6.16
  • Android构建系统:bazel构建
  • 工具链:gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-

定位Linux kernel crash问题的步骤

通常Linux Kernel crash时会有堆栈信息输出,从堆栈信息中可以知道导致Kernel crash的大概原因、Kernel crash时系统状态、Kernel crash时在执行什么。

根据Kernel crash log定位异常问题的步骤:

  1. 从log中确定异常方向、异常位置
  2. 从System.map中确定符号地址
  3. 通过addr2line工具确定异常代码位置

例子-定位Linux Kernel crash异常位置

从log中找异常信息

[    6.974145][    T1] arm,isp e8100000.isp: Adding to iommu group 11
[    6.980371][    T1] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000    //从这里看是空指针异常
[    6.989848][    T1] Mem abort info:
[    6.993331][    T1]   ESR = 0x0000000096000005
[    6.997772][    T1]   EC = 0x25: DABT (current EL), IL = 32 bits
[    7.003775][    T1]   SET = 0, FnV = 0
[    7.007521][    T1]   EA = 0, S1PTW = 0
[    7.011355][    T1]   FSC = 0x05: level 1 translation fault
[    7.016923][    T1] Data abort info:
[    7.020495][    T1]   ISV = 0, ISS = 0x00000005, ISS2 = 0x00000000
[    7.026672][    T1]   CM = 0, WnR = 0, TnD = 0, TagAccess = 0
[    7.032416][    T1]   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
[    7.038419][    T1] [0000000000000000] user address but active_mm is swapper
[    7.045464][    T1] Internal error: Oops: 0000000096000005 [#1] PREEMPT SMP
[    7.052421][    T1] Modules linked in:
[    7.056167][    T1] CPU: 3 PID: 1 Comm: swapper/0 Not tainted 6.6.58-android15-8-maybe-dirty-4k-SE-SDK2P5 #1 1400000003000000474e55008fa9e0c15629191d
[    7.069549][    T1] Hardware name: TI Davince Evaluation board (DT)
[    7.076245][    T1] pstate: 20000005 (nzCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[    7.083896][    T1] pc : readl+0x38/0x80
[    7.087819][    T1] lr : readl+0x38/0x80
[    7.091738][    T1] sp : ffffffc0828eb7f0
[    7.095743][    T1] x29: ffffffc0828eb7f0 x28: 0000000000000000 x27: 0000000000000000
[    7.103570][    T1] x26: 0000000000000000 x25: 0000000000000000 x24: ffffff8c97335d70
[    7.111396][    T1] x23: ffffff8eded5d8a8 x22: 0000000000000001 x21: ffffff8c97335d94
[    7.119220][    T1] x20: ffffffc080cc3e64 x19: 0000000000000000 x18: ffffffc0828c50a0
[    7.127046][    T1] x17: ffffffc0826e7a40 x16: ffffffc0826e7a70 x15: 001f00003fffffff
[    7.134872][    T1] x14: 0000000000000901 x13: 2000000000000000 x12: 0000000000000008
[    7.142697][    T1] x11: 000000000000002b x10: 0000000000000200 x9 : 0000000000000400
[    7.150522][    T1] x8 : 0000000000000007 x7 : 6e69616d6f642d72 x6 : 0000000000000004
[    7.158348][    T1] x5 : 0000000000005dc8 x4 : ffffffc08181b2a8 x3 : ffffffc080cc3e64
[    7.166173][    T1] x2 : ffffffc080cc400c x1 : 0000000000000000 x0 : 0000000000000020
[    7.173998][    T1] Call trace:
[    7.177136][    T1]  readl+0x38/0x80                 //这里看是isp_clk_gate_onoff -> readl踩到空指针
[    7.180708][    T1]  isp_clk_gate_onoff+0x5c/0x204   //这里看到isp driver中isp_clk_gate_onoff()执行时发生空指针异常
[    7.185495][    T1]  isp_platform_probe+0x3ac/0x9f8
[    7.190369][    T1]  platform_probe+0xc0/0xec
[    7.194724][    T1]  really_probe+0x190/0x374
[    7.199076][    T1]  __driver_probe_device+0xa0/0x12c
[    7.204122][    T1]  driver_probe_device+0x3c/0x218
[    7.208996][    T1]  __driver_attach+0x110/0x1ec
[    7.213608][    T1]  bus_for_each_dev+0x104/0x160
[    7.218310][    T1]  driver_attach+0x24/0x34
[    7.222576][    T1]  bus_add_driver+0x154/0x270
[    7.227104][    T1]  driver_register+0x68/0x104
[    7.231630][    T1]  __platform_driver_probe+0x50/0xc8
[    7.236764][    T1]  fw_module_init+0x30/0x78
[    7.241118][    T1]  do_one_initcall+0xdc/0x360
[    7.245645][    T1]  do_initcall_level+0xc8/0x19c
[    7.250347][    T1]  do_initcalls+0x70/0xc0
[    7.254527][    T1]  do_basic_setup+0x1c/0x28
[    7.258880][    T1]  kernel_init_freeable+0xd0/0x138
[    7.263841][    T1]  kernel_init+0x20/0x1ac
[    7.268022][    T1]  ret_from_fork+0x10/0x20
[    7.272290][    T1] Code: aa1303e1 aa1e03e3 aa1e03f4 97e989cd (b9400268)
[    7.279072][    T1] ---[ end trace 0000000000000000 ]---
[    7.287048][    T1] Kernel panic - not syncing: Oops: Fatal exception
[    7.293483][    T1] SMP: stopping secondary CPUs
[    7.298099][    T1] Kernel Offset: disabled
[    7.302277][    T1] CPU features: 0x000002,c0000000,70020143,1001720b

异常原因:

[    6.980371][    T1] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
[    7.045464][    T1] Internal error: Oops: 0000000096000005 [#1] PREEMPT SMP

从这两条日志可以确定导致kernel crash的原因是访问 "NULL pointer dereference"

异常位置:

[    7.083896][    T1] pc : readl+0x38/0x80   

从这条日志可以确定触发异常的操作

异常调用栈:

[    7.173998][    T1] Call trace:
[    7.177136][    T1]  readl+0x38/0x80    
[    7.180708][    T1]  isp_clk_gate_onoff+0x5c/0x204 
[    7.185495][    T1]  isp_platform_probe+0x3ac/0x9f8
[    7.190369][    T1]  platform_probe+0xc0/0xec
[    7.194724][    T1]  really_probe+0x190/0x374
[    7.199076][    T1]  __driver_probe_device+0xa0/0x12c
[    7.204122][    T1]  driver_probe_device+0x3c/0x218
[    7.208996][    T1]  __driver_attach+0x110/0x1ec
[    7.213608][    T1]  bus_for_each_dev+0x104/0x160
[    7.218310][    T1]  driver_attach+0x24/0x34
[    7.222576][    T1]  bus_add_driver+0x154/0x270
[    7.227104][    T1]  driver_register+0x68/0x104
[    7.231630][    T1]  __platform_driver_probe+0x50/0xc8
[    7.236764][    T1]  fw_module_init+0x30/0x78

从调用栈可以大致判断异常发生的时间段。如上日志可以确定是isp driver加载阶段probe处理时出现的异常。"isp_clk_gate_onoff+0x5c/0x204 "可以进一步确定异常位置是isp_clk_gate_onoff符号为基地址的0x5c偏移位置,0x204是isp_clk_gate_onoff代码段长度。

从System.map符号表中找基地址

如上,找到isp_clk_gate_onoff符号的地址

通过addr2line工具确定代码位置

这里使用llvm-addr2line定位代码中的位置。为什么不用aarch64-none-linux-gnu-addr2line在遇到的问题一节有说明。

step1.导出llvm-addr2line工具

export PATH=/data/yuxi/xx-builder/src/android-gki/prebuilts/clang/host/linux-x86/llvm-binutils-stable:$PATH

/data/yuxi/xx-builder/src/android-gki是自己本地android15源码目录,android系统构建时会生成llvm工具。

step2.根据代码段地址定位代码中位置

通过objdump工具对异常位置反汇编

借助反汇编和异常日志可以对问题进行更深入的分析。

遇到的问题

1. aarch64-none-linux-gnu-addr2line: vmlinux: unable to initialize decompress status for section .debug_aranges

执行命令:aarch64-none-linux-gnu-addr2line -e vmlinux 0xffffffc080cc4928

异常日志:

aarch64-none-linux-gnu-addr2line: vmlinux: unable to initialize decompress status for section .debug_aranges 
aarch64-none-linux-gnu-addr2line: vmlinux: unable to initialize decompress status for section .debug_aranges 
aarch64-none-linux-gnu-addr2line: vmlinux: file format not recognized

异常原因:

vmlinux是Linux Kernel构建时生成的一个静态链接的可执行文件,通常是ELF格式。根据之前Linux Kernel经验来说这个文件是原始的、未压缩的Linux内核镜像。但从返回的信息看这个文件是压缩的,恰巧使用的这个aarch64-none-linux-gnu-工具链不能对这种压缩进行解压。

问题解:

使用LLVM工具链,LLVM工具链通常对较新的ELF特性支持更好,而且Android15源码构建时也会有LLVM工具链生成。

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

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

相关文章

rocky 9部署Zabbix监控

一、rocky安装 需要注意在设置root用户密码时,勾选ssh远程连接 安装完成后直接用root登录 1. 网络配置 输入nmtui 进入网络配置界面 选择 Edit a connection,再选择接口 ens3 IPV4更改为Maual 手动模式 根据实际环境配置IP地址 重启网络 systemctl …

从9.4%到13.5%:ICDM2025录取率触底反弹,竞争压力稍缓

近日,ICDM 2025公布了论文录用结果。本次大会共收到785篇有效论文投稿,最终,共有106篇常规论文和70篇短论文被接收,总体接收率为22.4%,其中全文论文的接收率为13.5%。与前年9.4%、去年11.09%的录取率相比,I…

linux上安装methylkit -- 安全下车版 (正经版: Linux环境下安装methylKit的实践与避坑指南)

题外话: 我踩过的坑,都将成为我写贴的素材!(ㄒoㄒ) 整整安装了两天,这里面的滋味懂的都懂。 希望开发作者持续维护。 希望有人或者作者持续打包成sigularity镜像使用,并且直接传到github上,传到docker上下…

【leetcode】114. 二叉树展开为链表

文章目录题目题解1. 递归2. 迭代3. 右指针重排,始终将右子树添加到左子树的最右题目 114. 二叉树展开为链表 题解 1. 递归 先序遍历然后将数组操作 for i in range(1, len(res)):prev, curr res[i - 1], res[i]prev.left Noneprev.right curr# Definition fo…

Vibe Coding、AI IDE/插件

概述 Vibe Coding,氛围编程,AI辅助编程,三剑客: Google Gemini:OpenAI GPT:Anthropic Claude: IDE Cursor 基于VS Code开发。 特性: AI驱动的代码生成:输入想要的…

Unity高级UI拖动控制器教程

在游戏开发过程中,UI组件的拖动功能是一个常见的需求。特别是在需要实现拖动、边界检测、透明度控制以及动画反馈等功能时,编写一个高级UI拖动控制器将非常有用。在本文中,我们将创建一个支持多种Canvas模式和更精确边界检测的高级UI拖动控制…

零基础上手:Cursor + MCP 爬取 YouTube 视频数据

前言 大模型与 AI 应用越来越普及的今天,实时、稳定地获取网络数据变得尤为重要。无论是做内容分析、趋势研究还是自动化任务,爬取和处理数据始终是绕不开的一环。 传统爬虫往往面临封禁、验证码、动态渲染等难题,而 Bright Data MCP&#x…

frp 一个高性能的反向代理服务

文章目录项目概述核心特性系统架构快速开始1. 下载安装2. 服务端快速配置3. 客户端快速配置4. 验证连接配置文件说明代理类型TCP/UDP 代理HTTP/HTTPS 代理安全代理 (STCP/SUDP)P2P 代理 (XTCP)插件系统静态文件服务HTTP/SOCKS5 代理协议转换使用场景远程办公Web 服务发布游戏服…

Android -第二十一次技术总结

一、activity与Fragment的通信有哪些?使用接口进行通信的逻辑与代码示例使用接口通信的核心是解耦,通过定义一个接口作为通信契约,让 Fragment 不依赖于具体的 Activity 类型。1. 定义通信接口(在 Fragment 内)首先&am…

【算法】78.子集--通俗讲解

通俗易懂讲解“子集”算法题目 一、题目是啥?一句话说清 给你一个不含重复元素的整数数组,返回所有可能的子集(包括空集和它本身)。 示例: 输入:nums = [1,2,3] 输出:[[], [1], [2], [1,2], [3], [1,3], [2,3], [1,2,3]] 二、解题核心 使用回溯法(递归)或位运算来…

Cherrystudio的搭建和使用

1、下载和安装 Cherry Studio 官方网站 - 全能的 AI 助手 2、配置LLM 3、聊天助手 3.1 添加和编辑助手 3.2 选择LLM 3.3 对话聊天 4、配置MCP 4.1 安装MCP执行插件 4.2 安装 node和npm Node.js — Download Node.js npm -v 10.9.3 node -v v22…

基于Matlab结合肤色检测与卷积神经网络的人脸识别方法研究

近年来,随着人工智能与计算机视觉技术的发展,人脸识别在人机交互、安防监控、身份认证等领域得到了广泛应用。本文提出了一种基于 MATLAB 平台,结合 肤色检测与卷积神经网络(CNN) 的人脸识别方法。该方法首先利用肤色模…

在八月点燃AI智慧之火:CSDN创作之星挑战赛开启灵感盛宴

在八月点燃AI智慧之火:CSDN创作之星挑战赛开启灵感盛宴八月骄阳似火,智能时代的技术热情同样炽热。在这个充满创新活力的季节,「AIcoding八月创作之星挑战赛」正式拉开帷幕,为CSDN的创作者们打造一个展示才华、碰撞灵感的专业舞台…

解密 Vue 3 shallowRef:浅层响应式 vs 深度响应式的性能对决

📖 概述 shallowRef() 是 Vue 3 中的一个组合式 API 函数,用于创建浅层响应式引用。与 ref() 不同,shallowRef() 只在其 .value 被直接替换时触发响应式更新,不会深度监听对象内部属性的变化。 🎯 基本概念 什么是 sh…

Linux进程间通信(IPC)深入解析

Linux进程间通信(IPC)深入解析 1 概述 Linux 进程间通信 (Inter-Process Communication, IPC) 是不同进程之间交换数据与同步操作的机制。现代 Linux 内核提供了多种 IPC 方式,从传统的管道和 System V IPC 到现代的套接字和 D-Bus&#xff0…

TensorFlow-GPU版本安装

前言: (1)因项目需求,需要安装TensorFlow-GPU版本,故本文在此记录安装过程。 (2)有注释,优先看注释 (3)本文所使用的GPU为NVIDIA GeForce RTX 5080 Laptop GP…

Elasticsearch 索引字段删除,除了 Reindex 重建索引还有没有别的解决方案?

unsetunset1、问题来源unsetunset在生产环境维护 Elasticsearch 集群的过程中,经常会遇到这样的场景:业务需求变更导致某些字段不再使用,或者早期设计时添加了一些冗余字段,现在需要清理掉。最近球友在公司的一个项目中就遇到了这…

Ubuntu虚拟机磁盘空间扩展指南

这是一份详细且易于理解的 Ubuntu 虚拟机磁盘空间扩展指南。本指南涵盖了两种主流虚拟机软件(VirtualBox 和 VMware)的操作步骤,并分为 “扩展虚拟磁盘” 和 “在 Ubuntu 内部分配新空间” 两大部分。重要提示:在进行任何磁盘操作…

教程1:用vscode->ptvsd-创建和调试一个UI(python)-转载官方翻译(有修正)

vscode用python开发maya联动调试设置 3dsMax Python开发环境搭建 3文联动之debugpy调试max‘python. 3文联动之socket插槽注入max‘python 本教程是max主动接收创建代码的方式(预先运行界面,通过按钮主动读取py脚本,执行断点)&…

龙迅#LT7621GX适用于两路HDMI2.1/DP1.4A转HDMI2.1混切应用,分辨率高达8K60HZ!

1. 描述LT7621GX是一款高性能两路HDMI2.1/DP1.4转HDMI2.1混合开关芯片,用于显示应用。 HDCP RX作为HDCP中继器的上游,可以与其他芯片的HDCP TX配合,实现中继器功能。 对于HDMI2.1输入,LT7621GX可以配置为3/4通道。自适应均衡使其适…