文章目录
- 分析样例
- ------------[ cut here ]------------,起始标记
- 错误信息(有的有,有的没有)
- WARNING,提醒
- Modules linked in,列出所有已加载的模块
- (OE) ,外部模块
- Tainted、内核版本
- 硬件、BIOS
- RIP(x86 架构)
- Call Trace,调用栈跟踪
- ---[ end trace faed035a9d8d4039 ]---,结束标记
- ARM 架构
- 1. 处理器状态(pstate)
- 2. 程序计数器和链接寄存器
- 3. 栈指针和通用寄存器
- 4. 调用栈信息
分析样例
Feb 11 13:36:23 jv-hg-cpu-019 kernel: ------------[ cut here ]------------
Feb 11 13:36:23 jv-hg-cpu-019 kernel: list_add corruption. next->prev should be prev (ffff9f758ccac940), but was ffff9f763f5e3328. (next=ffff9f763b697d40).
Feb 11 13:36:23 jv-hg-cpu-019 kernel: WARNING: CPU: 55 PID: 65490 at lib/list_debug.c:23 __list_add_valid+0x33/0x70
Feb 11 13:36:23 jv-hg-cpu-019 kernel: Modules linked in: xt_CT xt_nat ipt_rpfilter xt_multiport iptable_raw ip_set_hash_ip ip_set_hash_net vxlan ip6_udp_tunnel udp_tunnel devlink veth nf_conntrack_netlink xt_addrtype xt_set ip_set_hash_ipportip ip_set_hash_ipport ip_set_bitmap_port ip_set_hash_ipportnet ip_set dummy nf_tables nfnetlink mmfs26(OE) mmfslinux(OE) fuse ip6table_mangle ip6t_MASQUERADE ip6table_filter ip6table_nat nf_conntrack_ipv6 nf_defrag_ipv6 nf_nat_ipv6 ip6_tables iptable_mangle ipt_MASQUERADE xt_conntrack xt_comment iptable_filter xt_mark iptable_nat nf_nat_ipv4 nf_nat tracedev(OE) overlay bonding intel_rapl skx_edac nfit libnvdimm x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel kvm vfat fat br_netfilter ipmi_ssif bridge irqbypass crct10dif_pclmul crc32_pclmul stp ghash_clmulni_intel pcbc llc aesni_intel
Feb 11 13:36:23 jv-hg-cpu-019 kernel: nf_conntrack_ipv4 iTCO_wdt iTCO_vendor_support crypto_simd ip_vs_sh mei_me hobot_pcie_ep_dev(OE) cryptd ip_vs_wrr pcspkr sg joydev hobot_pcie_common(OE) glue_helper i2c_i801 mei lpc_ich ioatdma ip_vs_rr wmi ipmi_si ip_vs ipmi_devintf ipmi_msghandler pcc_cpufreq acpi_cpufreq nf_conntrack binfmt_misc ip_tables xfs sd_mod ast nf_defrag_ipv4 drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops ttm ahci igb drm libahci i40e dca libata megaraid_sas i2c_algo_bit dm_mirror dm_region_hash dm_log dm_mod libcrc32c crc32c_intel
Feb 11 13:36:23 jv-hg-cpu-019 kernel: CPU: 55 PID: 65490 Comm: filebeat Kdump: loaded Tainted: G OE 4.18.0 #2
Feb 11 13:36:23 jv-hg-cpu-019 kernel: Hardware name: Default string Default string/DeepEngine-2000, BIOS 1.26 07/23/2024
Feb 11 13:36:23 jv-hg-cpu-019 kernel: RIP: 0010:__list_add_valid+0x33/0x70
Feb 11 13:36:23 jv-hg-cpu-019 kernel: Code: f2 75 18 4c 8b 0a 4d 39 c1 75 24 48 39 fa 74 39 49 39 f9 74 34 b8 01 00 00 00 c3 4c 89 c1 48 c7 c7 b0 66 6b 97 e8 dc 95 cb ff <0f> 0b 31 c0 c3 48 89 d1 4c 89 c6 4c 89 ca 48 c7 c7 00 67 6b 97 e8
Feb 11 13:36:23 jv-hg-cpu-019 kernel: RSP: 0018:ffffb6532da07d30 EFLAGS: 00010086
Feb 11 13:36:23 jv-hg-cpu-019 kernel: RAX: 0000000000000000 RBX: ffff9f763f5e29c0 RCX: 0000000000000006
Feb 11 13:36:23 jv-hg-cpu-019 kernel: RDX: 0000000000000007 RSI: 0000000000000086 RDI: ffff9f763f3d6830
Feb 11 13:36:23 jv-hg-cpu-019 kernel: RBP: ffff9f757be09400 R08: 00000000000023e0 R09: 0000000000000005
Feb 11 13:36:23 jv-hg-cpu-019 kernel: R10: 0000000000000000 R11: ffffffff9807d92e R12: ffff9f757be09540
Feb 11 13:36:23 jv-hg-cpu-019 kernel: R13: ffff9f758ccac940 R14: ffff9f763b697d40 R15: ffff9f561be4e55c
Feb 11 13:36:23 jv-hg-cpu-019 kernel: FS: 000000c00810a890(0000) GS:ffff9f763f3c0000(0000) knlGS:0000000000000000
Feb 11 13:36:23 jv-hg-cpu-019 kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
Feb 11 13:36:23 jv-hg-cpu-019 kernel: CR2: 00007f7111ffb718 CR3: 0000003f32894001 CR4: 00000000007606e0
Feb 11 13:36:23 jv-hg-cpu-019 kernel: DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Feb 11 13:36:23 jv-hg-cpu-019 kernel: DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Feb 11 13:36:23 jv-hg-cpu-019 kernel: PKRU: 55555554
Feb 11 13:36:23 jv-hg-cpu-019 kernel: Call Trace:
Feb 11 13:36:23 jv-hg-cpu-019 kernel: enqueue_entity+0x20f/0x620
Feb 11 13:36:23 jv-hg-cpu-019 kernel: enqueue_task_fair+0x6f/0x1e0
Feb 11 13:36:23 jv-hg-cpu-019 kernel: ttwu_do_activate+0x45/0x80
Feb 11 13:36:23 jv-hg-cpu-019 kernel: try_to_wake_up+0x1e5/0x4b0
Feb 11 13:36:23 jv-hg-cpu-019 kernel: wake_up_q+0x3b/0x60
Feb 11 13:36:23 jv-hg-cpu-019 kernel: futex_wake+0x14d/0x170
Feb 11 13:36:23 jv-hg-cpu-019 kernel: do_futex+0x157/0x1d0
Feb 11 13:36:23 jv-hg-cpu-019 kernel: __x64_sys_futex+0x141/0x16f
Feb 11 13:36:23 jv-hg-cpu-019 kernel: do_syscall_64+0x5b/0x180
Feb 11 13:36:23 jv-hg-cpu-019 kernel: entry_SYSCALL_64_after_hwframe+0x44/0xa9
Feb 11 13:36:23 jv-hg-cpu-019 kernel: RIP: 0033:0x46b143
Feb 11 13:36:23 jv-hg-cpu-019 kernel: Code: 24 20 c3 cc cc cc cc 48 8b 7c 24 08 8b 74 24 10 8b 54 24 14 4c 8b 54 24 18 4c 8b 44 24 20 44 8b 4c 24 28 b8 ca 00 00 00 0f 05 <89> 44 24 30 c3 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
Feb 11 13:36:23 jv-hg-cpu-019 kernel: RSP: 002b:000000c004be9e38 EFLAGS: 00000202 ORIG_RAX: 00000000000000ca
Feb 11 13:36:23 jv-hg-cpu-019 kernel: RAX: ffffffffffffffda RBX: 0000000000000001 RCX: 000000000046b143
Feb 11 13:36:23 jv-hg-cpu-019 kernel: RDX: 0000000000000001 RSI: 0000000000000081 RDI: 000000c00790c148
Feb 11 13:36:23 jv-hg-cpu-019 kernel: RBP: 000000c004be9e88 R08: 0000000000000000 R09: 0000000000000000
Feb 11 13:36:23 jv-hg-cpu-019 kernel: R10: 0000000000000000 R11: 0000000000000202 R12: 000000c004be9df0
Feb 11 13:36:23 jv-hg-cpu-019 kernel: R13: 0000000000000031 R14: 000000c005fb6680 R15: 0000000000000000
Feb 11 13:36:23 jv-hg-cpu-019 kernel: ---[ end trace faed035a9d8d4039 ]---
------------[ cut here ]------------,起始标记
在Linux内核崩溃(panic)日志中,------------[ cut here ]------------ 是一个标记,用于指示内核崩溃的起始点。这个标记通常出现在崩溃日志的开头,用于帮助开发者快速定位崩溃的起始位置。
错误信息(有的有,有的没有)
list_add corruption. next->prev should be prev (ffff9f758ccac940), but was ffff9f763f5e3328. (next=ffff9f763b697d40).
首先看错误信息:list_add corruption
,这表明在内核的链表操作中发生了数据损坏。链表是内核中常用的数据结构,当添加一个节点时,检查到next和prev指针不一致,导致警告。这通常意味着有内存越界、竞态条件或者并发问题,比如在链表操作时没有正确加锁,导致另一个线程同时修改了链表结构。
WARNING,提醒
表明内核检测到了一个可能会引发问题的情况,但这种情况还不至于让系统立即崩溃。它是一种提醒,提示系统管理员或者开发者需要关注某些异常状况。
WARNING: CPU: 55 PID: 65490 at lib/list_debug.c:23 __list_add_valid+0x33/0x70
CPU: 55
此信息指出异常发生在第 55 个 CPU 核心上。
PID: 65490
PID 即进程 ID,PID: 65490 意味着产生这个警告的是进程 ID 为 65490 的进程。结合日志中的 Comm: filebeat 可知,这个进程是 filebeat,它是 Elastic 公司开发的一款轻量级日志采集器。
lib/list_debug.c:23
这表明警告发生的源代码文件是 lib/list_debug.c,具体位置在该文件的第 23 行。list_debug.c 文件通常包含链表操作的调试代码,主要用于检查链表操作的正确性。
__list_add_valid+0x33/0x70
__list_add_valid 是一个函数名,这个函数的作用是验证链表添加操作的有效性。
+0x33 表示警告发生在 __list_add_valid 函数内部偏移量为 0x33(十六进制)的位置。
/0x70 代表 __list_add_valid 函数的总长度是 0x70 字节。
Modules linked in,列出所有已加载的模块
接下来,日志中列出了许多内核模块(Modules linked in),这些模块是当前加载到内核中的。这些模块是系统当前加载的所有模块,内核在生成错误报告时会列出所有已加载的模块,方便开发者或维护者排查问题。这些模块可能包括网络相关的(如veth、vxlan)、文件系统(如xfs、fuse)、虚拟化(如kvm)、硬件驱动(如i40e、ahci)等,这些都是系统正常运行所需的模块,并不一定直接导致问题。
(OE) ,外部模块
tracedev(OE)
在内核模块名称后面出现的 (OE) 表示该模块是 Out-of-Tree 模块,即这些模块不是内核源码树的一部分,而是作为外部模块加载的。这些模块通常是由第三方提供的,用于扩展内核的功能。
Tainted、内核版本
CPU: 55 PID: 65490 Comm: filebeat Kdump: loaded Tainted: G OE 4.18.0 #2
Tainted: G OE
Tainted 表示内核的 “污染” 状态,它反映了内核是否加载了一些可能影响系统稳定性或不符合内核许可协议的模块或代码。
- G 通常表示内核加载了非 GPL(GNU General Public License)许可的模块。GPL 是一种开源软件许可协议,要求使用该协议的软件及其衍生作品也必须开源。加载非 GPL 许可的模块可能会导致内核不符合严格的 GPL 许可要求。
- OE 表示加载了外部模块(Out - of - tree modules)。外部模块是指不在内核源代码树中的模块,这些模块可能是由第三方开发者编写的,其质量和稳定性可能参差不齐,有可能引入系统不稳定因素。
4.18.0 #2
这是内核的版本信息,4.18.0 是内核的主版本号,代表该系统使用的是 Linux 内核 4.18 系列的版本。#2 通常是该内核版本的编译序号,用于区分同一主版本号下不同的编译版本,不同的编译序号可能在配置、补丁等方面存在差异。
硬件、BIOS
Hardware name: Default string Default string/DeepEngine-2000, BIOS 1.26 07/23/2024
硬件型号为 DeepEngine-2000
BIOS 版本号为 1.26,发布日期为:07/23/2024
RIP(x86 架构)
RIP: 0010:__list_add_valid+0x33/0x70
RIP 是 x86_64 架构下的指令指针寄存器,它指向 CPU 即将执行的指令的内存地址。当内核出现异常时,记录 RIP 的值可以帮助开发者定位到具体是哪一条指令引发了问题。
Call Trace,调用栈跟踪
在Linux内核崩溃日志中,Call Trace(调用栈跟踪)是一个非常重要的部分,用于帮助开发人员定位问题的根源。它显示了导致崩溃的函数调用链,从而帮助开发人员快速找到问题所在。
示例:
enqueue_entity+0x20f/0x620
- enqueue_entity:这是内核中的一个函数,通常与调度器相关。它负责将一个任务(或实体)加入到调度队列中。
- +0x20f/0x620:这表示崩溃发生在 enqueue_entity 函数的偏移量 0x20f 处,而该函数的总长度为 0x620 字节。
—[ end trace faed035a9d8d4039 ]—,结束标记
—[ end trace faed035a9d8d4039 ]— 是内核追踪信息的结束标记,它与内核异常日志中的其他部分一起,构成了一个完整的异常追踪记录。
faed035a9d8d4039 是本次异常追踪的唯一标识符。这个标识符的作用是在需要的时候可以方便地定位和关联特定的异常追踪记录。例如,在分析大量的内核日志时,如果需要查找与某个特定异常相关的完整信息,就可以通过这个标识符快速定位到对应的追踪记录。
ARM 架构
pstate: 60400089 (nZCv daIf +PAN -UAO -TCO BTYPE=--)
[15728.897719] pc : tegra234_cbb_isr+0x130/0x170
[15728.897720] lr : tegra234_cbb_isr+0x10c/0x170
[15728.897721] sp : ffff800010003e10
[15728.897722] x29: ffff800010003e10 x28: ffff0515c661ba00
[15728.897725] x27: 0000000000000001 x26: 0000000000000080
[15728.897727] x25: ffffaa6b9d1b2f08 x24: ffffaa6b9db1be28
[15728.897729] x23: ffffaa6b9d4a7000 x22: 0000000000000018
[15728.897731] x21: ffffaa6b9d93f8b0 x20: 0000000000000002
[15728.897733] x19: ffffaa6b9d93f8a0 x18: 0000000000000010
[15728.897735] x17: 0000000000000000 x16: ffffaa6b9ba82d90
[15728.897737] x15: ffff0515c661bf70 x14: ffffffffffffffff
[15728.897740] x13: ffff800090003917 x12: ffff80001000391f
[15728.897742] x11: 0101010101010101 x10: 7f7f7f7f7f7f7f7f
[15728.897744] x9 : ffff800010003c30 x8 : 2a2a2a2a2a2a2a2a
[15728.897746] x7 : 2a2a2a2a2a2a2a09 x6 : c000000100017acf
[15728.897748] x5 : ffff0518eec57958 x4 : ffffaa6b9d7c7ee8
[15728.897750] x3 : 0000000000000001 x2 : ffffaa6b9bc17460
[15728.897753] x1 : ffff0515c661ba00 x0 : 0000000100010001
[15728.897755] Call trace:
[15728.897756] tegra234_cbb_isr+0x130/0x170
[15728.897759] __handle_irq_event_percpu+0x60/0x2a0
[15728.897761] handle_irq_event_percpu+0x3c/0xa0
[15728.897763] handle_irq_event+0x4c/0xf0
[15728.897765] handle_fasteoi_irq+0xbc/0x170
[15728.897767] generic_handle_irq+0x3c/0x60
[15728.897769] __handle_domain_irq+0x6c/0xc0
[15728.897770] gic_handle_irq+0x64/0x130
[15728.897771] el1_irq+0xd0/0x180
[15728.897774] _raw_spin_unlock_irqrestore+0x34/0x70
[15728.897776] pci_bus_read_config_dword+0x9c/0xe0
[15728.897778] pci_read_config_dword+0x44/0x70
[15728.897780] find_device_iter+0xe8/0x150
[15728.897781] pci_walk_bus+0x68/0xc0
[15728.897783] find_source_device+0x4c/0x78
[15728.897784] aer_isr+0x144/0x1d0
[15728.897786] irq_thread_fn+0x30/0xa0
[15728.897788] irq_thread+0x150/0x250
[15728.897790] kthread+0x148/0x170
[15728.897791] ret_from_fork+0x10/0x18
这段日志详细记录了内核在发生异常时的处理器状态、程序计数器、寄存器值以及函数调用栈信息,下面为你逐一分析各部分内容:
1. 处理器状态(pstate)
pstate: 60400089 (nZCv daIf +PAN -UAO -TCO BTYPE=–)
pstate 是处理器状态寄存器的值,括号内是对各个标志位的解读:
- nZCv:分别代表负数标志(Negative)、零标志(Zero)、进位标志(Carry)和溢出标志(Overflow),这些标志反映了最近一次算术运算的结果状态。
- daIf:d 可能与调试相关,a 可能和对齐检查有关,I 表示中断禁止(IRQ disable),f 表示快速中断禁止(FIQ disable)。
- +PAN:表示特权访问控制(Privileged Access Never)启用,限制用户态代码对特权资源的访问。
- -UAO:用户访问覆盖(User Access Override)禁用。
- -TCO:超时计数器(Timer/Counter Overflow)相关功能禁用。
- BTYPE=–:可能表示当前没有特定类型的异常或者异常类型未被记录。
2. 程序计数器和链接寄存器
[15728.897719] pc : tegra234_cbb_isr+0x130/0x170
[15728.897720] lr : tegra234_cbb_isr+0x10c/0x170
- pc(Program Counter):程序计数器,指向当前正在执行的指令地址。这里显示异常发生时正在执行 tegra234_cbb_isr 函数,偏移量为 0x130,该函数的总长度为 0x170 字节。
- lr(Link Register):链接寄存器,通常用于保存函数调用时的返回地址。这里 lr 也指向 tegra234_cbb_isr 函数,偏移量为 0x10c。
3. 栈指针和通用寄存器
[15728.897721] sp : ffff800010003e10
[15728.897722] x29: ffff800010003e10 x28: ffff0515c661ba00
…
[15728.897753] x1 : ffff0515c661ba00 x0 : 0000000100010001
- sp(Stack Pointer):栈指针,指向当前栈的顶部地址。
- x0 - x29:是 ARM64 架构下的通用寄存器,这些寄存器的值记录了异常发生时处理器的上下文信息,可用于分析函数调用时的参数传递和局部变量状态。
4. 调用栈信息
[15728.897755] Call trace:
[15728.897756] tegra234_cbb_isr+0x130/0x170
[15728.897759] __handle_irq_event_percpu+0x60/0x2a0
…
[15728.897791] ret_from_fork+0x10/0x18
调用栈信息展示了异常发生时函数的调用顺序,从最内层函数开始,逐步向外层展开。这有助于我们了解程序的执行路径,找出可能引发异常的函数调用链。具体分析如下:
- tegra234_cbb_isr:这是一个中断服务程序,可能与 NVIDIA Tegra234 芯片的时钟和总线相关的中断处理有关。异常发生在该函数内部偏移量 0x130 处。
- 后续的函数调用主要涉及中断处理、PCI 设备配置读取、设备查找、高级错误报告(AER)中断处理、内核线程执行等操作。这表明异常可能与硬件中断处理、PCI 设备交互或者内核线程调度有关。