91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux內(nèi)核bug狩獵指南:從棧跟蹤到修復(fù),官方文檔教你搞定系統(tǒng)核心故障

jf_44130326 ? 來(lái)源:Linux1024 ? 2026-02-06 16:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

內(nèi)核是Linux系統(tǒng)的心臟”——一旦它出bug,小則功能異常,大則系統(tǒng)崩潰、死機(jī)。但內(nèi)核bug往往藏在百萬(wàn)行代碼中,想快速定位、修復(fù)絕非易事。

wKgZPGkaixKAEFOlAAG3zpFDihU196.png

好在Linux內(nèi)核官方提供了一份詳細(xì)的《bug狩獵手冊(cè)》(kernel.org/doc/html/latest/admin-guide/bug-hunting.html),從識(shí)別日志信號(hào)到提交修復(fù)補(bǔ)丁,全程拆解實(shí)用方法。今天我們就基于這份權(quán)威文檔,梳理一套內(nèi)核bug排查實(shí)操指南,幫你高效解決內(nèi)核故障。

一、先看懂內(nèi)核的求救信號(hào):棧跟蹤與Oops信息

當(dāng)內(nèi)核遇到bug時(shí),不會(huì)沉默”——它會(huì)輸出棧跟蹤(stack dump日志,告訴你哪里出了問(wèn)題。這類(lèi)日志通常分兩種場(chǎng)景:

1.常見(jiàn)的警告型日志(WARNING

比如文檔中給出的例子,內(nèi)核會(huì)明確標(biāo)出出錯(cuò)的CPU、進(jìn)程、代碼位置:

------------[cuthere ]------------WARNING: CPU: 1 PID: 28102 at kernel/module.c:1108 module_put+0x57/0x70Modules linkedin: dvb_usb_gp8psk(-) dvb_usb dvb_core nvidia_drm(PO) ...CPU: 1 PID: 28102 Comm: rmmod Tainted: P    WC O 4.8.4-build.1#1Hardware name: MSI MS-7309/MS-7309, BIOS V1.12 02/23/2009...Call Trace: # 函數(shù)調(diào)用棧,記錄bug觸發(fā)時(shí)的代碼執(zhí)行路徑[] ? dump_stack+0x44/0x64[] ? __warn+0xfa/0x120[] ? module_put+0x57/0x70 # 關(guān)鍵:出錯(cuò)函數(shù)及偏移...

2.嚴(yán)重的崩潰型日志(Oops/BUG

如果bug導(dǎo)致內(nèi)核無(wú)法繼續(xù)運(yùn)行,會(huì)輸出帶“BUG”“Oops”的日志,比如空指針引用:

BUG: unable to handle kernelNULLpointer dereference at  (null)IP: [] iret_exc+0x7d0/0xa59# IP=指令指針,指向出錯(cuò)代碼地址Oops:0002[#1] PREEMPT SMP...

3.日志中的模塊標(biāo)記要注意

日志里“Modules linked in”后的模塊名,會(huì)帶特殊標(biāo)記,暗示模塊狀態(tài):

?(PO):模塊處于待處理狀態(tài)(Pending);

?(-):模塊正在卸載;

?(+):模塊正在加載;

?Tainted: P WC O:內(nèi)核被污染(比如加載了非開(kāi)源模塊,影響調(diào)試)。

二、別讓關(guān)鍵日志溜走:找到Oops信息的3種場(chǎng)景

想定位bug,首先得拿到完整的Oops日志——內(nèi)核會(huì)把日志存在不同地方,分場(chǎng)景獲?。?/span>

1.系統(tǒng)還能操作:從常規(guī)日志文件拿

內(nèi)核默認(rèn)通過(guò)klogd把日志傳給syslogd,存到這些位置:

?傳統(tǒng)系統(tǒng):/var/log/messages(路徑由/etc/syslog.conf配置);

?systemd系統(tǒng):用journalctl命令查看(比如journalctl -k只看內(nèi)核日志)。

如果klogd進(jìn)程意外退出,還能直接讀內(nèi)核緩沖區(qū):

# 把緩沖區(qū)日志存到文件dmesg > kernel_bug.log# 或?qū)崟r(shí)讀?。ò碈trl+C停止)cat/proc/kmsg > kernel_bug.log

2.系統(tǒng)崩潰卡死:3救命方法

如果機(jī)器完全凍住,無(wú)法輸入命令,試試這3招:

?應(yīng)急方案:手抄屏幕日志(或拍照),重啟后整理。若日志滾屏太快,可重啟時(shí)加vga=791(高分辨率模式)顯示更多內(nèi)容(需開(kāi)啟vesafb驅(qū)動(dòng),早期啟動(dòng)階段的bug無(wú)效);

?提前準(zhǔn)備:用串口控制臺(tái)(參考文檔Documentation/admin-guide/serial-console.rst——把兩臺(tái)機(jī)器用串口線(xiàn)連接,另一臺(tái)用Minicom等工具捕獲日志,適合長(zhǎng)期調(diào)試;

?專(zhuān)業(yè)方案:開(kāi)啟Kdump(內(nèi)核崩潰轉(zhuǎn)儲(chǔ))——提前配置后,崩潰時(shí)會(huì)通過(guò)kexec啟動(dòng)備用內(nèi)核,從內(nèi)存中提取日志(具體看Documentation/admin-guide/kdump/gdbmacros.txt)。

三、核心步驟:精準(zhǔn)定位bug的代碼行

拿到Oops日志后,下一步是找到具體哪行代碼出了問(wèn)題。文檔推薦兩種工具,gdb最常用,objdump可備用。

1.首選工具:gdb(需開(kāi)啟調(diào)試信息)

gdb能直接把Oops中的內(nèi)存地址,翻譯成文件名+行號(hào)”——但前提是內(nèi)核編譯時(shí)開(kāi)啟了**CONFIG_DEBUG_INFO**(調(diào)試信息)。

步驟1:開(kāi)啟內(nèi)核調(diào)試信息

kernel源碼目錄下,執(zhí)行命令開(kāi)啟配置:

# 關(guān)閉COMPILE_TEST,開(kāi)啟DEBUG_KERNEL和DEBUG_INFO./scripts/config -d COMPILE_TEST -e DEBUG_KERNEL -e DEBUG_INFO# 重新編譯內(nèi)核(生成帶調(diào)試信息的vmlinux文件)make vmlinux

步驟2:用gdb定位代碼

根據(jù)Oops日志中的關(guān)鍵信息(EIP地址或函數(shù)偏移),用gdb解析:

?情況1:有EIP地址(比如日志中EIP: 0060:[]):

gdbvmlinux # 加載帶調(diào)試信息的內(nèi)核文件(gdb) l *0xc021e50e # 查看該地址對(duì)應(yīng)的代碼

?情況2:有函數(shù)偏移(比如日志中EIP is at vt_ioctl+0xda8/0x1482):

gdbvmlinux(gdb) l *vt_ioctl+0xda8 # 查看vt_ioctl函數(shù)偏移0xda8的代碼# 輸出會(huì)直接指向文件和行號(hào),比如:# 0x1888 is in vt_ioctl (drivers/tty/vt/vt_ioctl.c:293)

步驟3:模塊級(jí)定位

如果bug在加載的模塊中(比如日志中dvb_usb_adapter_frontend_exit+0x3a/0x70 [dvb_usb]),直接加載模塊文件解析:

# 加載dvb-usb模塊的.o文件gdb drivers/media/usb/dvb-usb/dvb-usb.o(gdb) l *dvb_usb_adapter_frontend_exit+0x3a # 定位模塊內(nèi)代碼

2.備用工具:objdump(無(wú)調(diào)試信息也能用)

如果沒(méi)開(kāi)啟CONFIG_DEBUG_INFO,或只有模塊文件,可用objdump匯編代碼,間接定位問(wèn)題。

基本用法(查看帶源碼的反匯編)

# -r:顯示重定位信息;-S:混合顯示源碼和匯編;-l:顯示行號(hào)objdump -r -S -l net/dccp/ipv4.o

極端情況:無(wú)源碼時(shí)

如果連源碼都沒(méi)有,可提取Oops日志中“Code:”后的字節(jié)碼,手動(dòng)反匯編:

1.Code:后的字節(jié)(比如44 24 04 e8 6f ...)存到foo.s文件:

.text.globl foofoo:  .byte0x44,0x24,0x04,0xe8,0x6f, ... # 替換成實(shí)際字節(jié)

1.編譯并反匯編:

gcc-c -o foo.o foo.sobjdump --disassemble foo.o # 查看匯編代碼,推斷邏輯

1.簡(jiǎn)化操作:用內(nèi)核自帶腳本scripts/decodecode自動(dòng)處理(支持多架構(gòu))。

四、報(bào)告bug:讓維護(hù)者快速接手

定位到bug后,若自己無(wú)法修復(fù),需向上游報(bào)告——關(guān)鍵是找對(duì)人,讓負(fù)責(zé)該模塊的維護(hù)者看到。

1.用腳本找維護(hù)者:get_maintainer.pl

內(nèi)核源碼中的scripts/get_maintainer.pl,能直接輸出文件的維護(hù)者、郵件列表:

# 查看drivers/media/usb/gspca/sonixj.c的維護(hù)信息./scripts/get_maintainer.pl --bug -f drivers/media/usb/gspca/sonixj.c

輸出結(jié)果會(huì)包含:

?模塊維護(hù)者(比如Hans Verkuil );

?子系統(tǒng)維護(hù)者(比如Mauro Carvalho Chehab );

?相關(guān)郵件列表(比如linux-media@vger.kernel.org,模塊專(zhuān)屬列表);

?內(nèi)核通用列表(linux-kernel@vger.kernel.org)。

2.報(bào)告優(yōu)先級(jí):先bug tracker,再郵件

?若輸出中有“bug reporting URIs”bug跟蹤鏈接),優(yōu)先在跟蹤系統(tǒng)提交;

?若無(wú),發(fā)送郵件到模塊專(zhuān)屬郵件列表,并抄送維護(hù)者;

?完全沒(méi)頭緒時(shí),直接發(fā)linux-kernel@vger.kernel.org(通用列表,覆蓋所有維護(hù)者)。

五、修復(fù)bug:從定位到提交的最后一步

若你有編程能力,可嘗試修復(fù)bug——提交補(bǔ)丁時(shí),務(wù)必先讀Documentation/process/submitting-patches.rst,遵守內(nèi)核代碼規(guī)范(比如補(bǔ)丁格式、commit信息寫(xiě)法),這能大幅提高補(bǔ)丁被接受的概率。

畢竟開(kāi)源的核心是協(xié)作,你的一個(gè)小補(bǔ)丁,可能讓成千上萬(wàn)臺(tái)Linux機(jī)器更穩(wěn)定~

最后:klogd的小技巧

klogd(內(nèi)核日志守護(hù)進(jìn)程)是調(diào)試的隱形助手,注意兩點(diǎn):

1.1.3-pl3以上版本sysklogd包,支持地址自動(dòng)解析;

2.它會(huì)通過(guò)兩種方式解析地址:

?靜態(tài)解析:用System.map文件(內(nèi)核符號(hào)表);

?動(dòng)態(tài)解析:自動(dòng)獲取加載模塊的符號(hào)表(支持動(dòng)態(tài)調(diào)試模塊bug);

1.模塊加載/卸載后,可重啟klogd刷新符號(hào)表(具體看klogd手冊(cè))。

總結(jié)

內(nèi)核bug調(diào)試看似復(fù)雜,但只要跟著識(shí)別日志獲取日志定位代碼報(bào)告/修復(fù)的流程走,再借助gdb、get_maintainer.pl等工具,就能從無(wú)從下手變成有條理排查。

這份指南的所有方法都來(lái)自?xún)?nèi)核官方文檔,權(quán)威且實(shí)用——下次遇到內(nèi)核bug時(shí),不妨按這個(gè)流程試試,說(shuō)不定你就是解決問(wèn)題的關(guān)鍵人物~

如果有內(nèi)核調(diào)試的經(jīng)驗(yàn),歡迎在評(píng)論區(qū)分享你的小技巧~

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5198

    文章

    20442

    瀏覽量

    333976
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    4

    文章

    1467

    瀏覽量

    42870
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11758

    瀏覽量

    219006
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux 內(nèi)核的角度談線(xiàn)程和進(jìn)程

    。 Linux內(nèi)核將這4G字節(jié)的空間分為兩部分,將最高的1G字節(jié)(0xC0000000-0xFFFFFFFF)供內(nèi)
    的頭像 發(fā)表于 09-25 15:23 ?3107次閱讀
    <b class='flag-5'>從</b> <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)核</b>的角度談線(xiàn)程<b class='flag-5'>棧</b>和進(jìn)程<b class='flag-5'>棧</b>

    移植NXP官方linux 5.4內(nèi)核i.MX6ULL開(kāi)發(fā)板

    本文描述移植NXP官方 linux 5.4 內(nèi)核i.MX6ULL開(kāi)發(fā)板。
    發(fā)表于 12-19 11:10 ?2703次閱讀

    Linux內(nèi)核的作用

    Linux操作系統(tǒng)是當(dāng)今世界上最為廣泛使用的開(kāi)源操作系統(tǒng)之一,內(nèi)核則是一個(gè)操作系統(tǒng)核心和靈魂所
    發(fā)表于 07-06 11:46 ?2334次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>的作用

    從小白大牛:Linux嵌入式系統(tǒng)開(kāi)發(fā)的完整指南

    從小白大牛:Linux嵌入式系統(tǒng)開(kāi)發(fā)的完整指南 一、小白入門(mén):搭建 Linux 嵌入式開(kāi)發(fā)的認(rèn)知地基? 對(duì)于零基礎(chǔ)學(xué)習(xí)者,首先要打破 “嵌
    發(fā)表于 12-16 10:42

    關(guān)于Linux 應(yīng)用程序開(kāi)發(fā)到內(nèi)核開(kāi)發(fā)的指南!

    起來(lái)很快,估計(jì)2周就能上手。3. 進(jìn)入 Linux 內(nèi)核開(kāi)發(fā)。內(nèi)核開(kāi)發(fā)的學(xué)習(xí)難度要比 Linux 應(yīng)用程序開(kāi)發(fā)大 3倍左右?;旧?,有一年的linu
    發(fā)表于 09-24 11:12

    01,教你徹底學(xué)透RT-Thread

    野火《RT-Thread內(nèi)核實(shí)現(xiàn)與應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)指南》:本書(shū)第一部分以 RT-Thread Nano 3.0.3 官方源碼為藍(lán)本,抽絲剝繭,不斷迭代,教你怎么
    發(fā)表于 04-16 16:18

    Linux內(nèi)核文檔:ARM-啟動(dòng)

    Linux內(nèi)核文檔:ARM-啟動(dòng)
    發(fā)表于 10-30 10:15 ?6次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>文檔</b>:ARM-啟動(dòng)

    教你如何建立自己的Linux系統(tǒng)

    教你如何建立自己的Linux系統(tǒng)
    發(fā)表于 11-01 08:23 ?16次下載
    <b class='flag-5'>教你</b>如何建立自己的<b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>

    對(duì)Linux的進(jìn)程內(nèi)核的認(rèn)識(shí)

    在每一個(gè)進(jìn)程的生命周期中,必然會(huì)通過(guò)到系統(tǒng)調(diào)用陷入內(nèi)核。在執(zhí)行系統(tǒng)調(diào)用陷入內(nèi)核之后,這些內(nèi)核代碼所使用的
    發(fā)表于 05-12 08:53 ?908次閱讀
    對(duì)<b class='flag-5'>Linux</b>的進(jìn)程<b class='flag-5'>內(nèi)核</b><b class='flag-5'>棧</b>的認(rèn)識(shí)

    如何才能編譯Linux內(nèi)核

    內(nèi)核,是一個(gè)操作系統(tǒng)核心。它負(fù)責(zé)管理系統(tǒng)的進(jìn)程、內(nèi)存、設(shè)備驅(qū)動(dòng)程序、文件和網(wǎng)絡(luò)系統(tǒng),決定著系統(tǒng)
    發(fā)表于 11-04 18:04 ?8次下載

    教你們?nèi)绾问褂胑BPF追蹤LINUX內(nèi)核

    1. 前言 我們可以使用BPF對(duì)Linux內(nèi)核進(jìn)行跟蹤,收集我們想要的內(nèi)核數(shù)據(jù),從而對(duì)Linux中的程序進(jìn)行分析和調(diào)試。與其它的
    的頭像 發(fā)表于 04-20 11:26 ?3132次閱讀
    <b class='flag-5'>教你</b>們?nèi)绾问褂胑BPF追蹤<b class='flag-5'>LINUX</b><b class='flag-5'>內(nèi)核</b>

    如何使用BPF對(duì)Linux內(nèi)核進(jìn)行實(shí)時(shí)跟蹤

    我們可以使用BPF對(duì)Linux內(nèi)核進(jìn)行跟蹤,收集我們想要的內(nèi)核數(shù)據(jù),從而對(duì)Linux中的程序進(jìn)行分析和調(diào)試。與其它的
    的頭像 發(fā)表于 06-30 17:28 ?3065次閱讀
    如何使用BPF對(duì)<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>進(jìn)行實(shí)時(shí)<b class='flag-5'>跟蹤</b>

    修復(fù)win10、Linux系統(tǒng)無(wú)法啟動(dòng)的故障

    修復(fù)win10、Linux系統(tǒng)無(wú)法啟動(dòng)的故障的方法步驟。
    發(fā)表于 05-10 17:55 ?0次下載

    系統(tǒng)調(diào)用:用戶(hù)內(nèi)核的切換(上)

    當(dāng)發(fā)生系統(tǒng)調(diào)用、產(chǎn)生異常,外設(shè)發(fā)生中斷等事件時(shí),會(huì)發(fā)生用戶(hù)內(nèi)核之間的切換, 本文系統(tǒng)調(diào)用
    的頭像 發(fā)表于 07-31 11:27 ?1815次閱讀
    <b class='flag-5'>系統(tǒng)</b>調(diào)用:用戶(hù)<b class='flag-5'>棧</b>與<b class='flag-5'>內(nèi)核</b><b class='flag-5'>棧</b>的切換(上)

    騰訊云內(nèi)核團(tuán)隊(duì)修復(fù)Linux關(guān)鍵Bug

    Maintainer深感棘手的關(guān)鍵內(nèi)核bug。 這一改進(jìn)方案經(jīng)過(guò)嚴(yán)格評(píng)審和測(cè)試,最終被合并進(jìn)入后續(xù)的Linux LTS(長(zhǎng)期支持)版本中,標(biāo)志著騰訊云在操作系統(tǒng)
    的頭像 發(fā)表于 12-31 10:58 ?1102次閱讀