博客 / 詳情

返回

linux 常見穩定性問題分析方法

1.概述

穩定性對項目交付、用户體驗有着非常重要的影響,一般定義的穩定性問題是遇到了系統異常重啓或者系統卡死等,即無法按照預期為客户繼續提供功能和服務。地平線 SoC 平台提供了多種調試手段,去分析系統遇到的穩定性問題。

首先我們需要了解征程系列的軟硬件方案及異常 reset 路徑,通過了解異常路徑定位發生異常的節點和步驟,定位到問題方向。

其次,我們需要對發生問題節點提取的調試信息,包括抓取 log、抓取 ramdump 等,對於複雜問題,可能需要不斷的迭代 patch 以獲取更多調試信息,以縮小問題的範圍。

對於複雜問題,可能需要使用特定的工具去分析問題,如 crash-utility,T32,ftrace 等。

所以我們將穩定性問題的概述指導分為下面幾個章節進行介紹。

2. 常見問題

2.1.kernel panic

  • kernel panic 是最常見的系統異常,在 reset\_reason.txt 中顯示為 kpanic;
  • 一般通過 pstore log 就能看到 panic 時的棧和寄存器信息,通過分析上下文配合符號表及 gdb 等工具經常能夠直接定位問題;
  • 對於複雜問題,需要開啓 ramdump,抓取 dump 後進行分析。

一個典型的 kpanic 如下:

<4>[86758.651597] NMI backtrace for cpu 2
<4>[86758.651598] CPU: 2 PID: 105 Comm: khungtaskd Tainted: P           O       6.1.134-rt51-04836-g0b3e5cbe5431 #13
<4>[86758.651601] Hardware name: Horizon AI Technologies, Inc. HOBOT Sigi-P Matrix (DT)
<4>[86758.651602] Call trace:
<4>[86758.651817] NMI backtrace for cpu 4
<4>[86758.651821] CPU: 4 PID: 5110 Comm: glmark2-es2-drm Tainted: P           O       6.1.134-rt51-04836-g0b3e5cbe5431 #13
<4>[86758.651825] Hardware name: Horizon AI Technologies, Inc. HOBOT Sigi-P Matrix (DT)
<4>[86758.651826] pstate: 20400009 (nzCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
<4>[86758.651829] pc : mas_empty_area_rev+0x2f4/0x574
<4>[86758.651835] lr : mas_empty_area_rev+0x24c/0x574
<4>[86758.651838] sp : ffff800045eafab0
<4>[86758.651839] pmr_save: 000000e0
<4>[86758.651840] x29: ffff800045eafab0 x28: 00000000001fffff x27: 00000000002a0000
<4>[86758.651843] x26: 0000ffdf00000000 x25: 0000000000000018 x24: ffff00040c9d3000
<4>[86758.651846] x23: 0000000000200000 x22: ffff800008d30a28 x21: ffff00041a0cde0c
<4>[86758.651848] x20: 00000000002a0000 x19: ffff800045eafb48 x18: ffffffffffffffc2
<4>[86758.651850] x17: 0000ffdeff1fffff x16: 0000ffdf00000000 x15: 0000ffdeffffffff
<4>[86758.651852] x14: 0000000000200000 x13: 0000ffdeffffffff x12: ffff00041a0cde00
<4>[86758.651854] x11: ffff00041a0cde80 x10: 000000000029ffff x9 : ffffffffffffc005
<4>[86758.651856] x8 : 1fffe00083419bc1 x7 : 0000000000000000 x6 : 0000000000000000
<4>[86758.651858] x5 : 00000000003d0000 x4 : 0000ffdefee30000 x3 : ffff00041a0cde08
<4>[86758.651861] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff00041a0cde0c
<4>[86758.651863] Call trace:
<4>[86758.651864]  mas_empty_area_rev+0x2f4/0x574
<4>[86758.651867]  kbase_unmapped_area_topdown.constprop.0+0x150/0x27c [mali_kbase]
<4>[86758.651889]  kbase_context_get_unmapped_area+0x2b0/0x3b0 [mali_kbase]
<4>[86758.651904]  kbase_get_unmapped_area+0x4c/0x7c [mali_kbase]
<4>[86758.651920]  get_unmapped_area+0x60/0xf0
<4>[86758.651925]  do_mmap+0xe4/0x4fc
<4>[86758.651926]  vm_mmap_pgoff+0xf8/0x190
<4>[86758.651929]  ksys_mmap_pgoff+0xb8/0x10c
<4>[86758.651933]  __arm64_sys_mmap+0x38/0x50
<4>[86758.651934]  invoke_syscall+0x50/0x120
<4>[86758.651938]  el0_svc_common.constprop.0+0x58/0x190
<4>[86758.651941]  do_el0_svc+0x34/0xd0
<4>[86758.651944]  el0_svc+0x28/0xb0
<4>[86758.651946]  el0t_64_sync_handler+0xf4/0x120
<4>[86758.651949]  el0t_64_sync+0x19c/0x1a0
<0>[86758.652637] Kernel panic - not syncing: hung_task: blocked tasks
<4>[86758.652639] CPU: 2 PID: 105 Comm: khungtaskd Tainted: P           O       6.1.134-rt51-04836-g0b3e5cbe5431 #13
<4>[86758.652641] Hardware name: Horizon AI Technologies, Inc. HOBOT Sigi-P Matrix (DT)
<4>[86758.652641] Call trace:
<4>[86758.652642]  dump_backtrace+0xe4/0x140
<4>[86758.652644]  show_stack+0x20/0x30
<4>[86758.652645]  dump_stack_lvl+0x64/0x80
<4>[86758.652647]  dump_stack+0x18/0x34
<4>[86758.652649]  panic+0x198/0x394
<4>[86758.652653]  watchdog+0x2d0/0x510
<4>[86758.652655]  kthread+0x138/0x140
<4>[86758.652657]  ret_from_fork+0x10/0x20
<2>[86758.760353] SMP: stopping secondary CPUs
<0>[86758.760362] Kernel Offset: disabled
<0>[86758.760362] CPU features: 0x00000,000700a4,675072ab
<0>[86758.760364] Memory Limit: none

另外,一些其他的原因也會導致 kernel panic,詳細會在 Kernel panic 進行介紹。

2.2. Memory corruption

Memory corruption 類問題一般表現也是 kpanic,但是最明顯的標誌是問題的隨機性和不可解釋性,出現這類情況,一般要考慮是內存使用上出現了 UAF(Use-After-Free),OOB(Out-of-Bounds)。

這類問題的難點在於,系統出現異常 crash 時,已經是前面時間發生踩踏的結果,所以需要定位到踩踏發生的位置,才能正向解決這類問題,一般在系統中存在下述兩類踩踏問題:

a> Linux 內核發生踩踏:

  • 對於 Acore 中運行的 Linux 系統,KASAN 是目前檢查內存訪問越界(Out-Of-Bound)和釋放後訪問(Use-After-Free)問題最有效的工具,KASAN 依賴編譯器支持,當前 GCC-12.2 可以支持全功能的 KASAN,但是 KASAN 對性能和內存損耗非常嚴重,對於 slub 內存的使用問題,輕量級的 LUB\_DEBUG 往往也能提供幫助,但功能比較受限且提供的信息也比較有限。

b> SoC 子系統間的內存踩踏:

  • 在 征程 6X SoC 擁有 Acore、BPU、VDSP、Secure World(EL3)的多子系統 SoC, DDR 內存空間根據需求劃分給不同子系統,如果子系統間內存出現踩踏,整機系統可能會出現各種隨機異常;
  • 征程 6X SoC 中使用 firewall 對 SoC 各子系統間的內存越界踩踏進行檢測,當發生踩踏時由 EL3 觸發 crash。

2.3. Watchdog

  • 征程 6X SoC 中有 2 路 watchdog,目前使用 wdt0(監控 linux irq),wdt1(監控 linux 優先級為 50 的 rt kthread)。從/log/reset\_reason.txt 中可以看到 wdt 的 reason:
2025-06-13-13-35-25: mwdt xxx@e9e8fadb9907 debug 20250610-193933 1100
  • wdt 導致重啓後,系統會保存 pstore log,通過檢查 pstore 獲取異常信息;
  • wdt 狗咬中斷/事件由 MCU 域處理,MCU 域進行重啓。
  • wdt0:一般是 kernel 中某個 CPU 處於長時間無法響應中斷的狀態,征程 6X 平台上在 wdt1 狗咬時間(IRQ\_WDT\_TIMEOUT)到後會觸發一個 gic 中斷,在這個中斷中會使用 NMI 將所有 cpu 的調用棧打印;
  • wdt1:一般是 kernel 中某個 CPU 處於長時間無法調度優先級為 50 的 rt kthread 的狀態,征程 6X 平台上在 wdt2 狗咬時間(IRQ\_WDT\_TIMEOUT)到後會觸發一個 gic 中斷,在這個中斷中會使用 NMI 將所有 cpu 的調用棧打印。

2.4 firewall

在 征程 6X SoC 擁有 Acore、BPU、GPU、VDSP0、Secure World(EL3)等多個子系統,DDR 內存空間根據需求劃分給不同子系統。

如果子系統間內存/寄存器空間出現踩踏,整機系統可能會出現各種隨機異常。firewall 是 征程 6X SoC 上的硬件單元,功能就是根據配置捕獲子系統間的內存越界踩踏,當發生踩踏時由 EL3 觸發 crash。

在 MCU 域的 log 中會輸出發生越界訪問的地址信息和 master 信息,輸出示例如下:ID 為 0xd0 的 master 嘗試讀地址為 0x80000000 的內存空間。

MCU 域主動觸發 firewall 違例:

horizon:/$ regread 0x80000000

MCU 域的違例信息 log:

[016.346991 0]firewall module 136 read violation master ID:d0
[016.347654 0]violation port 0[016.348004 0]violation addr high:0, low:80000000
[016.348656 0]Reg 0x80000000 value is 0x12345678

horizon:/$ [016.369156 0][M][time_1: 000016 s, 346 ms] Fchm Info occur (34, 30, 2552, 136)[016.370239 0][M][time_2: 000016 s, 348 ms] 136-6-CF Occur (34, 30, 2552), Payload(00-00-136-00 00-00-00-128 00-00-00-00 208-00-00-00)[016.371715 0]Customer handle(63, 1, 2)[016.421368 0][M][time_1: 000016 s, 348 ms] Fchm Info occur (36, 3, 2553, 349)[016.422437 0][M][time_2: 000016 s, 348 ms] 349-6-CF Occur (36, 3, 2553), Payload(00-00-00-00 00-00-00-00 00-00-00-00 00-00-00-00)[016.423894 0]Customer handle(51, 1, 2)

征程 6X 部分內存的 firewall 權限設置:

Master ID 定義,詳見:hbbin\_j6p/boot/j6p/bl31-dts/include/hobot\_firewall.h。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.