Linux怎么查看具体的系统崩溃堆栈

陌雪小哥_6677

陌雪小哥_6677

2026-08-09

904人浏览

原创

直接查看/var/crash/最新子目录下的dmesg.*文件末尾50行,可快速定位panic或oops线索,如“kernel panic - not syncing”“oops”“call trace:”等关键信息,90%根因藏于此。

linux怎么查看具体的系统崩溃堆栈

崩溃后怎么快速定位 panic 或 Oops 行?

直接看 /var/crash/ 里最新子目录下的 dmesg.* 文件,它就是崩溃前内核的实时日志快照。别先急着跑 crash 工具——90% 的关键线索(比如 Kernel panic - not syncing、Oops、Call Trace:)就藏在最后几十行里。

执行:
cat /var/crash/$(ls -t /var/crash | head -n1)/dmesg.* | tail -n 50

  • 如果看到 BUG: unable to handle kernel NULL pointer dereference 这类提示,说明是空指针解引用,直接往下找 Call Trace: 后面的函数链
  • IP: 后面的地址是出问题的指令位置,SP: 是栈顶地址,这两个值后续用 crash 时会用到
  • 注意时间戳是否连续——有些系统在 panic 前会卡住几秒,dmesg 尾部时间跳变过大,说明日志可能被截断,得结合 journalctl -b -1 补充看上一次 boot 的日志

crash 工具里怎么看进程级堆栈?

crash 不是万能日志阅读器,它是用来解析 vmcore 内存镜像的交互式调试器。必须满足两个硬条件:有对应内核版本的 vmlinux 符号文件 + 正确加载了 dump.XXXX 文件。

进入崩溃目录后,运行:
crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux dump.XXXX

Zynq Linux Hardware Debug
Zynq Linux Hardware Debug

Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。

下载
  • 进到交互界面后,先输 bt ——这是最常用命令,显示当前 CPU 上崩溃线程的完整调用栈,包括函数名、偏移、源码行号(如果有 debuginfo)
  • 如果 bt 输出里全是十六进制地址没函数名,说明 vmlinux 路径不对或 debuginfo 包没装全;查路径用 find /usr/lib/debug -name vmlinux 2>/dev/null
  • 想看特定进程(比如 PID=1234)的栈,用 bt 1234;想看所有 CPU 的栈,用 bt -a

没 kdump 怎么临时抓内核堆栈?

系统还在跑、但已出现异常(比如软锁死、高延迟),又没配 kdump,可以用 SysRq 触发即时堆栈打印。前提是 /proc/sys/kernel/sysrq 值为 1(默认多数发行版开启)。

物理机或带控制台的虚拟机上操作:
按住 Alt + SysRq(即 Print Screen 键),松开后立刻按 t(小写)

  • 输出会刷到 dmesg 缓冲区,立刻执行 dmesg | tail -n 100 查看,里面会有每个 CPU 的 Call Trace:
  • 注意:这个操作不保存到磁盘,只存在内存日志中,重启就丢;如果系统已无响应,SysRq 可能失效
  • 某些云主机或容器环境禁用了 SysRq,检查 cat /proc/sys/kernel/sysrq 返回值,不是 1 就得先 echo 1 > /proc/sys/kernel/sysrq(需 root)

用户态程序崩溃的堆栈在哪找?

内核崩溃和用户程序崩溃是两套机制。用户态程序(如 nginx、python 脚本)崩溃,靠的是 core dump,不是 vmcore。

确认 core 生成已开启:
ulimit -c 必须非 0(推荐 ulimit -c unlimited);
sysctl kernel.core_pattern 看路径,常见值如 core.%e.%p 或 /var/lib/core/core.%e.%p

  • 找到 core 文件后,用 gdb ./your_program core.xxx,然后输 bt 查看用户态调用栈
  • 如果 bt 显示一堆 ??,说明编译时没加 -g,或者符号被 strip 过;release 版本建议保留 .debug 段或单独存符号文件
  • addr2line -e ./your_program -f -C 0x7f8b12345678 可把任意地址转成函数+行号,前提是二进制含调试信息

真正麻烦的不是怎么查,而是堆栈里混着内核态和用户态上下文——比如系统调用陷入内核后 panic,这时候得先用 crash 看内核栈,再用 gdb 对应 core 看用户态现场,两者地址空间完全独立,不能交叉解析。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5687

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2448

6

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5687

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2448

6

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4050

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3453

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2653

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6450

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

6082

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习