本文约4800字,今天开始学习Linux调试工具使用。本文整理一套Linux调试工具学习计划,覆盖从基础排查到内核级调试的全场景,聚焦高频工具(top、strace、tcpdump、gdb等)。后续细分帖整理常用的工具实战用法。
我建了一个BSP学习交流群,想学BSP或者已经是BSP开发者可私信我,加入群,一起交流学习,共同进步。
关注公众号, 即可获得与Linux相关的电子书籍以及常用开发工具,文末有文档清单。
在Linux学习与运维/开发工作中,“调试能力”是区分新手与进阶者的核心指标——当系统出现卡顿、进程崩溃、网络不通、性能瓶颈时,能否快速定位问题、排查根源,全靠调试工具的熟练运用。所以熟练掌握调试工具是必备技能。
一 学习前置准备
在开始调试工具学习前,需具备基础Linux功底,做好环境准备,避免因基础不足影响学习效率,重点完成3件事:
[1].环境准备:搭建Linux测试环境(推荐Ubuntu 20.04),可使用虚拟机(VMware)或云服务器(轻量应用服务器即可),建议配置2核4G以上,确保能同时运行多个调试工具,避免资源不足导致工具卡顿。
[2].基础回顾:复习Linux核心基础——进程/线程概念、文件系统结构、网络基础(TCP/UDP、端口、网卡)、Shell命令基础(ps、ls、grep、awk等),尤其是进程ID(PID)、端口号、日志路径等核心概念,这是调试工具使用的前提。
[3].工具清单梳理:提前了解Linux调试工具的分类,建立整体认知(后续分阶段深入),核心分类如下:
>>系统监控类:查看CPU、内存、磁盘、网络整体状态(top、htop、vmstat等);
>>进程调试类:排查进程崩溃、死锁、异常占用(ps、strace、gdb、pstack等);
>>网络调试类:解决网络不通、丢包、端口异常(ss、tcpdump、nc、telnet等);
>>日志分析类:定位服务启动失败、运行异常(tail、grep、journalctl、dmesg等);
>>内核调试类:深入内核层面排查底层问题(ftrace、perf、动态调试等)。
准备要点:测试环境建议关闭防火墙(或开放常用端口),避免拦截调试工具通信;提前安装常用工具(yum install -y sysstat net-tools tcpdump gdb等),减少学习过程中的环境干扰。
二 三个阶段学习计划
第一阶段:基础入门—— 掌握“全局监控”,能排查基础故障
核心目标:熟悉Linux系统整体监控工具,能快速定位“CPU高占用、内存泄漏、磁盘满、网络不通”等基础故障,建立“先看全局、再找局部”的调试思维,无需深入底层,重点解决“是什么问题”。
[1]. 核心工具(重点掌握4个,优先实操)
top/htop:系统整体监控(CPU、内存、进程),最常用的调试入口,重点掌握“排序、筛选、参数解读”;
ps/ppid:进程查看,定位进程状态、PID、父进程ID,配合grep筛选目标进程,是后续进程调试的基础。
df/du:磁盘空间监控,排查“磁盘满”故障,区分“磁盘整体占用”与“单个目录占用”。
ss/netstat:网络连接监控,查看端口监听状态、TCP/UDP连接,替代传统netstat(ss效率更高,尤其适合高并发场景)。
[2]. 学习任务细分
任务1:学习top/htop,完成以下实操:
用top查看系统CPU、内存占用,学会按CPU(P键)、内存(M键)排序,识别占用最高的进程;
解读top输出参数(%us用户态CPU、%sy内核态CPU、%id空闲CPU、VSZ虚拟内存、RSS物理内存);
实操:模拟CPU高占用(运行yes > /dev/null &),用top定位进程PID,并用kill命令终止进程。
任务2:学习ps/ppid,完成以下实操:
掌握ps常用命令:ps -ef(查看所有进程详细信息)、ps aux(查看进程资源占用);
用ps + grep组合筛选目标进程(如ps -ef | grep nginx),查看进程PID、父进程ID、运行状态;
实操:启动nginx服务,用ps查看nginx进程的PID、启动用户,终止nginx进程后观察进程状态变化。
任务3:学习df/du、ss/netstat,完成以下实操:
用df -h查看所有磁盘分区的空间占用,用du -sh /* 排查哪个目录占用空间最大;
实操:模拟磁盘满(创建大文件dd if=/dev/zero of=test.img bs=1G count=1),用df/du定位占用源,删除大文件释放空间;
用ss -tuln查看所有监听端口,用ss -an | grep 8080筛选指定端口的连接状态;
实操:启动一个监听端口(nc -l 8080 &),用ss查看端口监听状态,用telnet测试端口连通性。
[3]. 阶段目标与验收
能独立完成以下4个基础故障排查:
>>系统卡顿,定位CPU占用最高的进程并终止;
>>服务器提示“磁盘空间不足”,排查并清理占用最大的目录/文件;>>测试服务器某个端口(如80、3306)是否监听,排查端口不通的基础原因(服务未启动/端口未开放)。
[4]. 避坑要点
top中%sy(内核态CPU)过高,通常是内核进程或驱动问题,而非用户进程;%wa(IO等待)过高,需排查磁盘IO问题;
ss命令中,LISTEN状态表示端口正在监听,ESTABLISHED表示已建立连接,TIME_WAIT表示连接已关闭但未释放;
du命令需结合目录路径使用,避免直接du /* (可能占用大量资源),可先du -sh /home、/var等常用目录缩小范围。
第二阶段:进阶提升—— 掌握“专项调试”,定位具体故障根源
核心目标:脱离“全局监控”,聚焦专项场景(进程异常、网络故障、日志分析),掌握3类核心专项工具,能定位“进程崩溃原因、网络丢包、服务启动失败”等具体问题,建立“场景→工具→命令”的对应思维。
[1]. 核心工具(分场景掌握,重点实操组合命令)
>>进程调试:strace + gdb
strace:跟踪进程的系统调用,排查“进程无法启动、异常退出”的原因(如文件缺失、权限不足);
gdb:调试运行中的进程或核心转储文件(core dump),排查进程崩溃、死锁、代码逻辑错误,尤其适合C/C++开发调试和服务崩溃排查。
>>网络调试:tcpdump + nc
tcpdump:抓取网络数据包,分析TCP/UDP报文,排查“丢包、报文异常、请求超时”等底层网络问题;
nc(netcat):测试端口连通性、模拟客户端/服务器通信,被称为网络调试“瑞士军刀”,比telnet功能更强大。
日志分析:tail + grep + journalctl + dmesg
tail/grep:实时查看日志、筛选关键信息,排查服务运行异常;
journalctl:查看系统日志和服务日志,尤其适合Systemd管理的服务;
dmesg:查看内核日志,排查驱动、硬件、内核进程的异常。
[2]. 学习任务细分
任务1:进程调试(strace + gdb)
学习strace基础:strace -p PID(跟踪指定进程)、strace -o output.log 命令(将跟踪结果输出到文件)、strace -e open(只跟踪open系统调用);
实操1:模拟进程启动失败(如删除nginx的配置文件,启动nginx),用strace ./nginx 跟踪启动过程,定位“配置文件缺失”的错误;
学习gdb基础:安装gdb(yum install -y gdb),掌握gdb ./程序(调试未启动程序)、gdb -p PID(调试运行中进程)、break(设置断点)、run(运行程序)、print(查看变量)、backtrace(查看函数调用栈)等核心命令;
实操1:编写一个简单的C程序(包含异常逻辑,如数组越界),用gcc -g编译(生成调试信息),用gdb调试,定位异常代码行;
实操2:模拟进程崩溃,生成core dump文件,用gdb分析core文件,定位崩溃原因(需先开启core dump:ulimit -c unlimited)。
任务2:网络调试(tcpdump + nc)
学习tcpdump基础:tcpdump -i eth0(抓取eth0网卡数据包)、tcpdump port 8080(抓取指定端口)、tcpdump host 192.168.1.10(抓取指定IP的数据包)、tcpdump -w dump.pcap(将数据包保存到文件,供后续分析);
实操1:用nc模拟服务器(nc -l 8080)和客户端(nc 127.0.0.1 8080)通信,用tcpdump抓取通信数据包,查看TCP三次握手、四次挥手过程;
实操2:模拟网络丢包(用tc命令:tc qdisc add dev eth0 root netem loss 50%),用tcpdump抓取数据包,观察丢包现象,分析丢包原因;
实操3:用tcpdump抓取HTTP请求(访问本地nginx),查看请求头、响应头信息,定位“请求无法访问”的问题(如请求路径错误)。
任务3:日志分析(tail + grep + journalctl + dmesg)
实操1:用tail -f /var/log/nginx/access.log 实时查看nginx访问日志,用grep "404" /var/log/nginx/access.log 筛选404错误请求,定位请求路径问题;
实操2:用journalctl -u nginx 查看nginx服务日志,排查nginx启动失败的原因(如端口被占用、配置错误);
实操3:用dmesg | grep error 查看内核错误日志,排查硬件(如磁盘)、驱动的异常;
实操4:用grep + awk组合筛选日志,如grep "ERROR" /var/log/messages | awk '{print $1,$2,$3,$NF}' 提取错误日志的时间和核心信息。
第三阶段:高级精通—— 掌握“内核级调试”,解决复杂故障
核心目标:突破“用户态调试”的局限,深入内核层面,掌握性能分析和内核调试工具,能解决“CPU高负载、内存泄漏、内核死锁、复杂网络瓶颈”等高级故障,适配企业级运维/开发场景,这也是Linux进阶学习的核心重点。
[1]. 核心工具(聚焦性能与内核,难度较高,重点理解原理+实操)
>>性能分析:perf + iostat + iotop
perf:Linux内核自带的性能分析工具,支持CPU、内存、磁盘、网络等多维度性能分析,能定位性能瓶颈(如函数调用耗时、CPU缓存命中率),是企业级性能调试的核心工具;
iostat:磁盘IO性能分析,查看磁盘读写速度、IO等待时间,排查磁盘IO瓶颈;
iotop:按进程查看磁盘IO占用,定位高IO进程,补充iostat的不足。
>>内核调试:ftrace + 动态调试
ftrace:内核函数跟踪工具,无需修改内核代码,即可跟踪内核函数的调用过程、执行时间,排查内核级死锁、函数异常调用等问题,是内核调试的基础工具;
动态调试:通过启用/禁用内核日志消息,过滤内核调试信息,无需重启内核即可调试,适合内核模块和驱动调试,前提是内核开启CONFIG_DYNAMIC_DEBUG配置。
>>内存调试:valgrind + pmap
valgrind:内存调试工具,检测内存泄漏、内存越界、使用未初始化内存等问题,尤其适合C/C++程序的内存调试;
pmap:查看进程的内存映射,分析进程内存占用的详细情况,定位内存泄漏的具体模块。
[2]. 学习任务细分
任务1:性能分析(perf + iostat + iotop)
学习iostat/iotop:掌握iostat -x 2(每2秒刷新一次,查看详细IO指标),重点解读%util(磁盘IO使用率)、r_await/w_await(IO等待时间);用iotop -o查看有IO活动的进程,定位高IO进程;
实操1:模拟磁盘IO高负载(dd if=/dev/sda1 of=/dev/null bs=1M count=1000),用iostat查看磁盘IO使用率,用iotop定位dd进程,终止进程后观察IO状态变化;
学习perf基础:安装perf(yum install -y perf),掌握perf top(实时查看CPU占用最高的函数)、perf record(记录性能数据)、perf report(分析性能数据)、perf stat(查看性能统计信息);
实操2:运行一个高CPU占用的程序(如循环计算的C程序),用perf top定位占用CPU最高的函数,用perf record -g 记录函数调用栈,用perf report分析性能瓶颈;
任务2:内核调试(ftrace + 动态调试)
学习ftrace基础:了解ftrace的核心原理(基于tracefs文件系统),掌握tracefs挂载(mount -t tracefs nodev /sys/kernel/tracing)、函数跟踪(echo 函数名 > /sys/kernel/tracing/set_ftrace_filter)、查看跟踪日志(cat /sys/kernel/tracing/trace);
实操1:启用ftrace函数跟踪,跟踪sys_open函数(文件打开系统调用的内核实现),执行ls命令,查看sys_open的调用过程和参数;
学习动态调试:了解动态调试的适用场景(仅支持pr_debug()、dev_dbg()等特定调试语句),掌握动态调试命令(echo "-p; file 文件名 +p" > /proc/dynamic_debug/control),启用指定文件的调试日志;
实操2:启用v4l2-h264.c文件的所有pr_debug()调试日志,执行相关命令,查看调试输出(grep =p /proc/dynamic_debug/control);
任务3:内存调试(valgrind + pmap)
学习valgrind基础:安装valgrind(yum install -y valgrind),掌握valgrind --leak-check=yes ./程序(检测内存泄漏)、valgrind --tool=memcheck(检测内存错误);
实操1:编写一个存在内存泄漏的C程序(如malloc分配内存后未free),用valgrind检测,定位内存泄漏的位置和大小;
学习pmap:掌握pmap PID(查看进程内存映射)、pmap -x PID(查看详细内存占用),分析进程的代码段、数据段、共享库的内存占用;
实操2:运行一个长期运行的程序,用pmap定期查看其内存占用,结合valgrind,定位内存泄漏的具体模块。
以上为全文内容。

这里是女程序员的笔记本
15年+嵌入式软件工程师兼二胎宝妈
分享读书心得、工作经验,自我成长和生活方式。
希望我的文字能对你有所帮助