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
英文地址,請注明出處:http://en.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通道。自適應均衡使其適…