關于Linux Kernel Panic導致重啟的簡單分析步驟

Linux系統Kernel Panic的檢索

如何判斷是否發生Kernel Panic,以下以 CentOS 7.9系統為例

#查看 /var/crash 路徑下是否有生成文件夾,Kernel Panic后會生成文件夾在此路徑表示產生了Kernel Panic
ls /var/crash
#/var/crash/127.0.0.1-2023-12-04-08\:57\:47/vmcore

如何建造debug環境

#Kernel Panic文件有了,分析需要對應的工具才能進行,步驟如下
#  安裝 crash
yum install crash
#  查看內核版本
uname -r
#下載 內核debug info,3.10.0-693.el7.x86_64 是uname -r 查出來的版本
wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-common-x86_64-3.10.0-693.el7.x86_64.rpm
wget http://linuxsoft.cern.ch/centos-debuginfo/7/x86_64/kernel-debuginfo-3.10.0-693.el7.x86_64.rpm
#假設下載很慢,建議直接瀏覽器上這個網站下載
#下載好以后使用 rpm -ivh xxx.rpm 安裝以上兩個rpm包#安裝好以后,運行crash應該能看到以下信息:
[root@localhost vmcore]# crashcrash 7.2.3-11.el7_9.1
Copyright (C) 2002-2017  Red Hat, Inc.
Copyright (C) 2004, 2005, 2006, 2010  IBM Corporation
Copyright (C) 1999-2006  Hewlett-Packard Co
Copyright (C) 2005, 2006, 2011, 2012  Fujitsu Limited
Copyright (C) 2006, 2007  VA Linux Systems Japan K.K.
Copyright (C) 2005, 2011  NEC Corporation
Copyright (C) 1999, 2002, 2007  Silicon Graphics, Inc.
Copyright (C) 1999, 2000, 2001, 2002  Mission Critical Linux, Inc.
This program is free software, covered by the GNU General Public License,
and you are welcome to change it and/or distribute copies of it under
certain conditions.  Enter "help copying" to see the conditions.
This program has absolutely no warranty.  Enter "help warranty" for details.GNU gdb (GDB) 7.6
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu"...WARNING: kernel relocated [184MB]: patching 87476 gdb minimal_symbol valuesKERNEL: /usr/lib/debug/lib/modules/3.10.0-1160.88.1.el7.x86_64/vmlinuxDUMPFILE: /dev/crashCPUS: 12DATE: Mon Dec  4 10:10:19 2023UPTIME: 00:13:14
LOAD AVERAGE: 0.29, 0.32, 0.29TASKS: 987NODENAME: localhost.localdomainRELEASE: 3.10.0-1160.88.1.el7.x86_64VERSION: #1 SMP Tue Mar 7 15:41:52 UTC 2023MACHINE: x86_64  (2096 Mhz)MEMORY: 15.4 GBPID: 4240COMMAND: "crash"TASK: ffff9e0d1eefc200  [THREAD_INFO: ffff9e0d083f4000]CPU: 0STATE: TASK_RUNNING (ACTIVE)crash> 

這是正常的,可以開始接下來的步驟:

crash /lib/debug/lib/modules/3.10.0-1160.88.1.el7.x86_64/vmlinux /var/crash/127.0.0.1-2023-12-04-08\:57\:47/vmcore

以上/var/crash/127.0.0.1-2023-12-04-08\:57\:47/vmcore是kernel panic后生成的文件夾內的信息
解析他可以看到kernel panic的原因

范例一:
創造一個kernel panic的場景
可以使用 以下命令直接觸發,觸發后系統會在幾秒內重啟

echo c > /proc/sysrq-trigger 

范例二:
使用oom 觸發:
之前有提到我之前 fio 命令導致 觸發 out of memory 觸發 oom-killer,內核有辦法設定,讓OOM觸發的時候直接Panic重啟,以下是命令:

sysctl -w vm.panic_on_oom=1
sysctl -w kernel.panic=10
echo "vm.panic_on_oom=1" >> /etc/sysctl.conf
echo "kernel.panic=10" >> /etc/sysctl.conf

在此設定下,即可使系統在觸發OOM后10s重啟,同時 /var/crash 內會生成文件夾
以下是我觸發OOM的腳本:
首先是fio配置,至于OOM原因,參考我之前的文章:
https://blog.csdn.net/weixin_44517278/article/details/131661105
以下配置寫到 fio.conf

[JEDEC-219]
ioengine=libaio
direct=1
rw=randrw
norandommap
randrepeat=0
rwmixread=40
iodepth=128
numjobs=4
bssplit=512/4:1024/1:1536/1:2048/1:2560/1:3072/1:3584/1:4k/67:8k/10:16k/7:32k/3:64k/3
blockalign=4k
random_distribution=zoned:50/5:30/15:20/80
loops=10000filename=/dev/nvme0n1
group_reporting
write_iops_log=iops.log
write_bw_log=bw.log
write_lat_log=lat.log

然后為了快速觸發,我使用for循環去快速觸發:

for i in {0..100};do nohup fio fio.conf &;sleep 1;done

這樣很快就能觸發oom panic,系統重啟,重啟后能在 /var/crash中查到一個帶剛剛日期時間的文件夾,如我試驗的時候生成的/var/crash/127.0.0.1-2023-12-04-09\:56\:53/vmcore ,然后可以用上文說的命令進行分析,如下:

[root@localhost vmcore]# crash /lib/debug/lib/modules/3.10.0-1160.88.1.el7.x86_64/vmlinux /var/crash/127.0.0.1-2023-12-04-09\:56\:53/vmcorecrash 7.2.3-11.el7_9.1
Copyright (C) 2002-2017  Red Hat, Inc.
Copyright (C) 2004, 2005, 2006, 2010  IBM Corporation
Copyright (C) 1999-2006  Hewlett-Packard Co
Copyright (C) 2005, 2006, 2011, 2012  Fujitsu Limited
Copyright (C) 2006, 2007  VA Linux Systems Japan K.K.
Copyright (C) 2005, 2011  NEC Corporation
Copyright (C) 1999, 2002, 2007  Silicon Graphics, Inc.
Copyright (C) 1999, 2000, 2001, 2002  Mission Critical Linux, Inc.
This program is free software, covered by the GNU General Public License,
and you are welcome to change it and/or distribute copies of it under
certain conditions.  Enter "help copying" to see the conditions.
This program has absolutely no warranty.  Enter "help warranty" for details.GNU gdb (GDB) 7.6
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu"...WARNING: kernel relocated [932MB]: patching 87476 gdb minimal_symbol valuesKERNEL: /lib/debug/lib/modules/3.10.0-1160.88.1.el7.x86_64/vmlinuxDUMPFILE: /var/crash/127.0.0.1-2023-12-04-09:56:53/vmcore  [PARTIAL DUMP]CPUS: 12DATE: Mon Dec  4 09:56:51 2023UPTIME: 00:11:41
LOAD AVERAGE: 60.96, 26.74, 13.81TASKS: 915NODENAME: localhost.localdomainRELEASE: 3.10.0-1160.88.1.el7.x86_64VERSION: #1 SMP Tue Mar 7 15:41:52 UTC 2023MACHINE: x86_64  (2095 Mhz)MEMORY: 15.4 GBPANIC: "Kernel panic - not syncing: Out of memory: system-wide panic_on_oom is enabled"PID: 7020COMMAND: "fio"TASK: ffff9b237633c200  [THREAD_INFO: ffff9b24f013c000]CPU: 8STATE: TASK_RUNNING (PANIC)

如上,可以看到PANIC的點是由于 PANIC: "Kernel panic - not syncing: Out of memory: system-wide panic_on_oom is enabled"

范例三:

WARNING: kernel relocated [54MB]: patching 87292 gdb minimal_symbol valuesKERNEL: /lib/debug/lib/modules/3.10.0-1160.el7.x86_64/vmlinuxDUMPFILE: ./127.0.0.1-2023-10-15-12.14.31/vmcore  [PARTIAL DUMP]CPUS: 112DATE: Mon Oct 16 00:13:16 2023UPTIME: 2 days, 04:29:35
LOAD AVERAGE: 9.20, 8.26, 8.13TASKS: 990NODENAME: sh-dell01RELEASE: 3.10.0-1160.el7.x86_64VERSION: #1 SMP Mon Oct 19 16:18:59 UTC 2020MACHINE: x86_64  (2000 Mhz)MEMORY: 63.3 GBPANIC: "BUG: unable to handle kernel NULL pointer dereference at           (null)"PID: 44133COMMAND: "umount"TASK: ffff8b476bc9b180  [THREAD_INFO: ffff8b40973d8000]CPU: 61STATE: TASK_RUNNING (PANIC)

分析命令:ps 查看系統崩潰前的進程 帶 > 的是活躍進程,也是有可能導致系統崩潰的進程

crash> ps44118      2  15  ffff8b4f4851e300  IN   0.0       0      0  [kworker/15:2]44125      2  68  ffff8b479fb29080  IN   0.0       0      0  [kworker/68:2]
> 44133      1  61  ffff8b476bc9b180  RU   0.0  123620   1220  umount44136      2  58  ffff8b4789091080  IN   0.0       0      0  [kworker/58:2]44139      1  58  ffff8b476bc9c200  UN   0.0  123620   1224  umount44141      1  59  ffff8b476bc9d280  UN   0.0  123608    996  swapoff

分析命令:log 查看系統崩潰時所有的dmesg(崩潰導致系統重啟,重啟前的dmesg可以在這里查看)

crash> log
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
..............................

分析命令: bt 查看系統崩潰前的堆棧信息

crash> bt
PID: 44133  TASK: ffff8b476bc9b180  CPU: 61  COMMAND: "umount"#0 [ffff8b40973db980] machine_kexec at ffffffff84666294#1 [ffff8b40973db9e0] __crash_kexec at ffffffff84722562#2 [ffff8b40973dbab0] crash_kexec at ffffffff84722650#3 [ffff8b40973dbac8] oops_end at ffffffff84d8b798#4 [ffff8b40973dbaf0] no_context at ffffffff84675d14#5 [ffff8b40973dbb40] __bad_area_nosemaphore at ffffffff84675fe2#6 [ffff8b40973dbb90] bad_area_nosemaphore at ffffffff84676104#7 [ffff8b40973dbba0] __do_page_fault at ffffffff84d8e750#8 [ffff8b40973dbc10] do_page_fault at ffffffff84d8e975#9 [ffff8b40973dbc40] page_fault at ffffffff84d8a778[exception RIP: jbd2_superblock_csum+58]RIP: ffffffffc06f969a  RSP: ffff8b40973dbcf8  RFLAGS: 00010246RAX: 0000000000000000  RBX: ffff8b4778d39000  RCX: ffff8b40973dbfd8RDX: 0000000000000000  RSI: ffff8b4778d39000  RDI: ffff8b4f72e9d800RBP: ffff8b40973dbd28   R8: ffff8b40973dbdc8   R9: 0000000000000001R10: 0000000000000001  R11: ffff8b47895d3200  R12: 000000000e33f513R13: ffff8b4f72e9d800  R14: 0000000000001c11  R15: ffff8b4778d39000ORIG_RAX: ffffffffffffffff  CS: 0010  SS: 0018
#10 [ffff8b40973dbd30] jbd2_write_superblock at ffffffffc06fa61c [jbd2]
#11 [ffff8b40973dbd70] jbd2_mark_journal_empty at ffffffffc06facbd [jbd2]
#12 [ffff8b40973dbda0] jbd2_journal_destroy at ffffffffc06faf6e [jbd2]
#13 [ffff8b40973dbe10] ext4_put_super at ffffffffc0913680 [ext4]
#14 [ffff8b40973dbe50] generic_shutdown_super at ffffffff8485051d
#15 [ffff8b40973dbe70] kill_block_super at ffffffff84850997
#16 [ffff8b40973dbe90] deactivate_locked_super at ffffffff84850cfe
#17 [ffff8b40973dbeb0] deactivate_super at ffffffff84851486
#18 [ffff8b40973dbec8] cleanup_mnt at ffffffff84870b0f
#19 [ffff8b40973dbee0] __cleanup_mnt at ffffffff84870ba2
#20 [ffff8b40973dbef0] task_work_run at ffffffff846c275b
#21 [ffff8b40973dbf30] do_notify_resume at ffffffff8462cc65
#22 [ffff8b40973dbf50] int_signal at ffffffff84d942efRIP: 00007f785a783a07  RSP: 00007ffc82e094e8  RFLAGS: 00000246RAX: 0000000000000000  RBX: 00005597e34bc040  RCX: ffffffffffffffffRDX: 0000000000000001  RSI: 0000000000000000  RDI: 00005597e34c2280RBP: 00005597e34c2280   R8: 00005597e34c21f0   R9: 0000000000000000R10: 00007ffc82e08920  R11: 0000000000000246  R12: 00007f785b301d78R13: 0000000000000000  R14: 00005597e34bc140  R15: 00005597e34bc040ORIG_RAX: 00000000000000a6  CS: 0033  SS: 002b

這里可以看到 最后在 #22 [ffff8b40973dbf50] int_signal at ffffffff84d942ef 調用發生問題,
可以進一步查看,我這里指向的地址是ffffffff84d942ef
分析命令:dis 反匯編該地址,查看源碼Fail位置

crash> dis -l ffffffff84d942ef
/usr/src/debug/kernel-3.10.0-1160.el7/linux-3.10.0-1160.el7.x86_64/arch/x86/kernel/entry_64.S: 701
0xffffffff84d942ef <int_signal+18>:     mov    $0xfe0e,%edi

上面列出了源碼指向/usr/src/debug/kernel-3.10.0-1160.el7/linux-3.10.0-1160.el7.x86_64/arch/x86/kernel/entry_64.S: 701
可以直接查看源碼相應位置:

crash> cat -n /usr/src/debug/kernel-3.10.0-1160.el7/linux-3.10.0-1160.el7.x86_64/arch/x86/kernel/entry_64.S
#篩選了一下結果.....695  int_signal:696          testl $_TIF_DO_NOTIFY_MASK,%edx697          jz 1f698          movq %rsp,%rdi          # &ptregs -> arg1699          xorl %esi,%esi          # oldset -> arg2700          call do_notify_resume701  1:      movl $_TIF_WORK_MASK,%edi702  int_restore_rest:703          RESTORE_REST704          DISABLE_INTERRUPTS(CLBR_NONE)705          TRACE_IRQS_OFF706          jmp int_with_check707          CFI_ENDPROC708  END(system_call)

尷尬的是找到這里對我來說也沒啥用,看不懂源碼…

以上,暫時記錄這些…遇到更多Kernel Panic的案例會再總結記錄上來

參考文章:
https://blog.csdn.net/linuxvfast/article/details/116591523
https://blog.csdn.net/weixin_45030965/article/details/124960224

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211534.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211534.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211534.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HarmonyOS應用開發者基礎認證考試(穩過)

判斷題 ??????? 1. Web組件對于所有的網頁都可以使用zoom(factor: number)方法進行縮放。錯誤(False) 2. 每一個自定義組件都有自己的生命周期正確(True) 3. 每調用一次router.pushUrl()方法&#xff0c;默認情況下&#xff0c;頁面棧數量會加1&#xff0c;頁面棧支持的…

linux redis-cluster ipv6方式

配置文件&#xff0c;具體字段的含義&#xff0c;可以參考其他文檔。 1.單個文件的配置信息 redis_36380.conf requirepass Paas_2024port 36380tcp-backlog 511timeout 0tcp-keepalive 300daemonize yessupervised nopidfile /data/paas/apps/aicache-redis/redis_36380.p…

【STM32】TIM定時器編碼器

1 編碼器接口簡介 Encoder Interface 編碼器接口 編碼器接口可接收增量&#xff08;正交&#xff09;編碼器的信號&#xff0c;根據編碼器旋轉產生的正交信號脈沖&#xff0c;自動控制CNT自增或自減&#xff0c;從而指示編碼器的位置、旋轉方向和旋轉速度 接收正交信號&#…

黑豹程序員-EasyExcel實現導出

需求 將業務數據導出到excel中&#xff0c;老牌的可以選擇POI&#xff0c;也有個新的選擇EasyExcel。 有個小坑&#xff0c;客戶要求樣式比較美觀&#xff0c;數字列要求千位符&#xff0c;保留2位小數。 可以用代碼實現但非常繁瑣&#xff0c;用模板就特別方便&#xff0c;模…

C++優秀串口庫

serial::Serial Class Reference #include <serial.h> Data Structures class ScopedReadLockclass ScopedWriteLock Public Member Functions公有成員方法&#xff08;編程用的都在這里了&#xff0c;那些私有的如果不開源一般跟我們沒有關系了&#xff09; Serial …

用chatGPT開發項目:我想的無人的智慧樹網站 流量之神 利用人工智能的算法將人吸引住 GPT4是不是越來越難用了,問一下就要證明一下自己是不是人類

廣度發散&#xff1a;讓AI給出時代或今日或你關注的熱點事件 比如采集新聞頭條&#xff0c;根據內容或標題&#xff0c;以不同的角度&#xff0c;或各種人群的角色&#xff0c;生成50篇簡短的文章。一下就能占傳統的搜索引擎。這是AI最擅長的【千人千面&#xff0c;海量生成】…

【中國海洋大學】操作系統隨堂測試6整理

1. IO系統的層次機構包括&#xff1a;IO硬件、中斷處理程序、&#xff08;&#xff09;程序、設備獨立性軟件、用戶層軟件。 答&#xff1a;設備驅動 2. IO設備和控制器之間的接口包括三種類型的信號&#xff1a;數據信號線、控制信號線和&#xff08;&#xff09;&#xff1…

qt反射基礎

最近研究了一下QT的反射機制&#xff0c; Qt的元對象系統除了提供信號/槽機制的特性之外&#xff0c;它還提供了以下特性: QObject::metaObject() 返回關聯的元對象 QMetaObject::className() 在運行時狀態下返回類名 QObject::inherits() 判斷類的繼承關系 QObject::tr()&…

鴻蒙開發之封裝優化

面向對象開發離不開封裝&#xff0c;將重復的可以復用的代碼封裝起來&#xff0c;提高開發效率。 基于之前的List&#xff0c;對代碼進行封裝。 1、抽取component 將List的頭部抽離出來作為一個新的component。可以創建一個新的ArkTS文件&#xff0c;寫我們的頭部代碼 為了…

代理模式:解析對象間的間接訪問與控制

目錄 引言 理解代理模式 不同類型的代理模式 代理模式的應用場景 代理模式的優缺點 優點 缺點 實際案例&#xff1a;Java中的代理模式應用 結語 引言 代理模式是軟件設計模式中的一種結構型模式&#xff0c;旨在為其他對象提供一種代理以控制對這個對象的訪問。它允許你…

消息隊列使用指南

介紹 消息隊列是一種常用的應用程序間通信方法&#xff0c;可以用來在不同應用程序或組件之間傳遞數據或消息。消息隊列就像一個緩沖區&#xff0c;接收來自發送方的消息&#xff0c;并存儲在隊列中&#xff0c;等待接收方從隊列中取出并處理。 在分布式系統中&#xff0c;消…

死鎖問題,4個必要條件+避免死鎖

目錄 引入 死鎖 概念 示例 多把鎖 單鎖 4個必要條件 用途 引入 我們用加鎖的方式保證了多個線程訪問臨界資源時,不會出現數據紊亂的問題 但是,鎖的引入,會導致出現其他的問題 死鎖 概念 在多線程或多進程的并發環境中&#xff0c;兩個或多個進程或線程被永久阻塞&…

esxi全稱“VMware ESXi

esxi全稱“VMware ESXi”&#xff0c;是可直接安裝在物理服務器上的強大的裸機管理系統&#xff0c;是一款虛擬軟件&#xff1b;ESXi本身可以看做一個操作系統&#xff0c;采用Linux內核&#xff0c;安裝方式為裸金屬方式&#xff0c;可直接安裝在物理服務器上&#xff0c;不需…

數據結構算法-希爾排序算法

引言 在一個普通的下午&#xff0c;小明和小森決定一起玩“誰是老板”的撲克牌游戲。這次他們玩的可不僅僅是娛樂&#xff0c;更是要用撲克牌來決定誰是真正的“大老板”。 然而&#xff0c;小明的牌就像剛從亂麻中取出來的那樣&#xff0c;毫無頭緒。小森的牌也像是被小丑擲…

Agent學習筆記

背景&#xff1a;LLM → \to → Agent ChatGPT為代表的大語言模型就不用過多的介紹了&#xff0c;ChatGPT很強大&#xff0c;但是也有做不到的東西。例如&#xff1a; 實時查詢問題&#xff1a;實時的天氣&#xff0c;地理位置&#xff0c;最新新聞報道&#xff0c;現實世界…

十年婚姻·總結八

十年婚姻總結八 女人一生的合伙人不能只是帥哥哥 女人一生的合伙人不能只是帥哥哥 浪漫的本質還是你的籌碼。 比如你送男人5萬的手表&#xff0c;但你沒什么其他籌碼&#xff08;皮膚粗糙蠟黃、沒人脈金錢資源、長的胖&#xff09;。 那個男人會覺得你胡鬧&#xff0c;你送的…

分類預測 | SSA-HKELM-Adaboost麻雀算法優化混合核極限學習機的數據分類預測

分類預測 | SSA-HKELM-Adaboost麻雀算法優化混合核極限學習機的數據分類預測 目錄 分類預測 | SSA-HKELM-Adaboost麻雀算法優化混合核極限學習機的數據分類預測分類效果基本描述程序設計參考資料 分類效果 基本描述 1.SSA-HKELM-Adaboost麻雀算法優化混合核極限學習機的數據分類…

引用文獻算作重復率么【一文讀懂】

大家好&#xff0c;今天來聊聊引用文獻算作重復率么&#xff0c;希望能給大家提供一點參考。 以下是針對論文重復率高的情況&#xff0c;提供一些修改建議和技巧&#xff1a; 引用文獻算作重復率么 在學術研究和論文撰寫過程中&#xff0c;引用文獻是不可或缺的一部分小發貓偽…

shell學習1——txt文件備份,文件名加個年月日的后綴,如test.txt對于備份文件為test.txt_20231205

跟B站Up主學習shell腳本——阿銘linux 3461576172505894 需求 txt文件備份&#xff0c;文件名加個年月日的后綴&#xff0c;如test.txt對于備份文件為test.txt_20231205 代碼 #!/bin/bash ##定義后綴變量 suffixdate %Y%m%d##找到/test/目錄下的txt文件 for f in find /tes…

ubuntu源配置文件/etc/apt/sources.list不存在

若使用命令sudo apt-get update報錯&#xff1a;apt-get:找不到命令&#xff0c;八成是源配置文件/etc/apt/sources.list不存在。但是一般來說不會不存在&#xff0c;若真的不小心刪除的話&#xff0c;我們也可以進行恢復。 首先創建/etc/apt/sources.list文件&#xff0c;然后…