当前位置:首页>Linux>Linux 系统 Bug 调试操作手册

Linux 系统 Bug 调试操作手册

  • 2026-09-26 04:28:41
Linux 系统 Bug 调试操作手册

Linux 系统 Bug 调试操作手册

适用环境:Ubuntu 20.04 / 22.04 / 24.04(systemd 体系)目标读者:有基础 Linux 经验的后端开发,目标是能独立定位中低复杂度问题覆盖问题:崩溃(Crash)、挂起(Hang)、OOM、性能劣化、服务启动失败工具原则:优先系统自带工具(procps / iproute2 / systemd / util-linux),少量常用诊断工具通过官方 apt 源安装,不依赖任何第三方商业软件

使用约定

  • 每个命令后跟一行 「看什么」,说明输出里该盯住的关键字或数值。
  • 命令中的 <svc> 指 systemd 服务名,<PID> 指进程号,按实际替换。
  • 排查顺序永远是:先保现场 → 再看资源 → 后动进程。没采集信息就重启,等于销毁证据。
  • 正文含 6 张 Mermaid 流程图(总决策树 + 五类问题专项流程)。GitHub / GitLab / Typora 原生渲染;VS Code 需装 Mermaid 预览插件。

1. 信息采集清单(到场后前 60 秒)

不管什么问题,

输出本身就是第一手证据,也能让后续排查少绕路。

#
命令
用途
预期输出里的关键字
1
uptime
总览负载与运行时长
load average:
 三个数是否递增;是否超过 CPU 核数
2
free -h
内存与 swap 概况
available
 是否接近 0;Swap 是否用满
3
df -h
磁盘空间
是否有分区 Use% 100%
4
df -i
inode 使用率
IUse%
 是否 100%(空间没满也写不进文件)
5
vmstat 1 5
CPU / 内存 / 换页动态趋势
r
/b 列、us sy wa st、si so
6
dmesg -T | tail -50
内核近期消息(带时间戳)
segfault
、Out of memory、I/O error、EXT4-fs error
7
journalctl -p 3 -xb | tail -50
本次开机以来 error 级日志
报错集中在哪个 unit / 哪个服务
8
systemctl --failed
处于失败状态的 unit
失败服务列表
9
ps aux --sort=-%mem | head -15
内存占用 Top 进程
谁的 RSS 异常大
10
ps aux --sort=-%cpu | head -15
CPU 占用 Top 进程
谁的 %CPU 异常高
11
ss -lntp
监听端口与对应进程
预期端口是否都在;有无意外监听
12
ss -s
连接状态汇总
timewait
 / close-wait 数量是否异常

一次性快照(可直接粘贴执行):

uptime; free -h; df -h; df -i; ss -s; dmesg -T | tail -30

看什么:一眼扫过去是否已有明显异常——磁盘满、内存空、连接堆积、内核报错,任何一条命中就直接指向对应章节。

补充:如果机器装了 sysstat(见 §4),历史数据是"案发当时"的唯一证人:

sar -u -f /var/log/sysstat/sa(systemctl show <svc> -p EnvironmentFile --value)

看什么:环境文件是否存在、格式是否为 KEY=VALUE(不能带 export、不能有行内注释展开)。

端口占用:

ss -lntp | grep <端口>

看什么:端口被哪个进程占着——常见于旧进程没退干净,或两个服务配了同一端口。

以运行用户身份手动复现:

sudo -u <服务运行用户> <ExecStart原始命令>

看什么:报什么错。root 手动跑能起来、服务用户跑不起来 = 权限问题;这一步能复现 80% 的启动失败。

日志不足时追踪系统调用:

strace -f -e trace=openat,connect,bind -o /tmp/<svc>.trace <ExecStart 原始命令>

看什么:哪个文件打开失败(= -1 ENOENT 路径不存在 / EACCES 无权限)、哪个 connect/bind 失败。

判断依据:退出码定大方向,日志定具体行。90% 的启动失败归为五类——配置错误、端口冲突、权限不足、路径/文件缺失、依赖服务未就绪。改过 unit 文件后务必:

systemctl daemon-reload && systemctl restart <svc>

看什么:不先 daemon-reload,重启用的还是旧配置,会造成"改了没生效"的错觉。


4. 常用工具速查表

标注「自带」的为 Ubuntu 服务器默认安装;其余一条命令装齐:

sudo apt update && sudo apt install -y gdb strace lsof sysstat iotop tcpdumpsudo apt install -y linux-tools-common linux-tools-generic "linux-tools-(uname -r);虚拟机报权限错误时调低 kernel.perf_event_paranoid。Ubuntu 的 core dump 被 systemd-coredump 接管,用 coredumpctl 查,不要去进程目录里找 core 文件。区分两种退出:code=killed 是被信号杀(外部/OOM/段错误),code=exited 是进程自己退出(看 status 码)。磁盘"满"有两种:容量满(df -h)和 inode 满(df -i),后者更隐蔽。改了 unit 文件先 systemctl daemon-reload,否则重启加载的还是旧配置。

最新文章

随机文章