常用 Linux Debug 命令总结

发布时间:2026/7/23 16:47:46
常用 Linux Debug 命令总结 常用 Linux Debug 命令总结在开发和运维过程中Linux 系统提供了强大的命令行工具来帮助开发者定位和解决问题。无论是排查性能瓶颈、分析内存泄漏还是调试网络异常熟练掌握这些 Debug 命令都能显著提升效率。本文将从实战角度出发通过大量代码示例来演示常用 Linux Debug 命令的使用方法。## 1. 进程与系统状态监控### 1.1top与htop实时监控系统负载top是最经典的系统监控命令能显示 CPU、内存、进程等实时信息。htop是其增强版提供更友好的交互界面。bash# 运行 top 命令按 P 键按 CPU 排序按 M 键按内存排序top# 安装 htop如果未安装sudo apt-get install htop # Debian/Ubuntusudo yum install htop # CentOS/RHEL# 运行 htop可以看到彩色进程树和资源使用情况htop实战案例当服务器响应变慢时使用top观察%CPU和%MEM列找到占用资源最高的进程然后按k键输入 PID 强制结束异常进程。### 1.2ps进程快照分析ps命令可以获取进程的详细状态结合grep快速定位目标进程。bash# 查看所有进程的完整信息ps aux# 查找特定进程如名为 java 的进程ps aux | grep java# 显示进程树观察父子关系ps -ef --forest# 查看某个 PID 的线程数ps -Lf -p 1234实战案例假设发现 CPU 占用率过高用ps aux --sort-%cpu | head -10列出 CPU 使用率最高的 10 个进程然后使用strace跟踪该进程的系统调用。## 2. 系统调用与性能分析### 2.1strace跟踪系统调用和信号strace是调试应用行为的神器它可以记录进程与内核的交互包括文件操作、网络连接、内存分配等。python# 示例跟踪 ls 命令的系统调用输出到文件strace -o strace_ls.log ls -l /tmp# 跟踪正在运行的进程PID1234strace -p 1234# 仅跟踪特定的系统调用如 open, read, writestrace -e traceopen,read,write -p 1234实战案例调试一个卡死的 Python Web 服务使用strace -p PID观察是否阻塞在recvfrom或connect系统调用上从而判断是网络延迟还是代码死锁。### 2.2ltrace跟踪库函数调用与strace类似但ltrace专注于动态库函数的调用适合调试应用层问题。bash# 跟踪 ls 命令的库函数调用只显示前 20 行ltrace -n 20 ls -l /tmp# 跟踪进程的 malloc/free 调用用于分析内存泄漏ltrace -e mallocfree -p 1234示例代码写一个简单的 C 程序来演示ltrace的效果。c#include stdio.h#include stdlib.h#include string.hint main() { char *buf malloc(1024); strcpy(buf, Hello, debugging world!); printf(%s\n, buf); free(buf); return 0;}编译并运行bashgcc -o test_debug test_debug.cltrace -e mallocfreeprintf ./test_debug输出示例malloc(1024) 0x5555555592a0strcpy(0x5555555592a0, Hello, debugging world!) 0x5555555592a0printf(Hello, debugging world!) 23free(0x5555555592a0) void## 3. 内存与堆栈分析### 3.1valgrind内存错误检测valgrind是 C/C 开发者必备的调试工具能检测内存泄漏、非法读写等问题。bash# 安装 valgrindsudo apt-get install valgrind# 使用 valgrind 运行程序检测内存泄漏valgrind --leak-checkfull --show-leak-kindsall ./test_debug实战案例使用valgrind检测以下有内存泄漏的 Python C 扩展代码此处用 C 示例c#include stdlib.hvoid leak_memory() { int *p malloc(100 * sizeof(int)); // 忘记 free(p)}int main() { leak_memory(); return 0;}运行valgrind后会输出12345 LEAK SUMMARY:12345 definitely lost: 400 bytes in 1 blocks### 3.2gdb强大的调试器gdb是 Linux 上最常用的调试器支持断点、单步执行、查看变量等。bash# 编译时加 -g 选项保留调试信息gcc -g -o test_debug test_debug.c# 启动 gdbgdb ./test_debug# 在 gdb 中设置断点(gdb) break main(gdb) break 10 # 在第10行设置断点# 运行程序(gdb) run# 单步执行(gdb) step# 查看变量值(gdb) print buf(gdb) print *buf10 # 打印 buf 的前10个字符# 查看堆栈(gdb) backtrace# 退出 gdb(gdb) quit实战案例当程序段错误Segmentation Fault时用gdb运行程序输入run后等待崩溃然后用backtrace查看调用栈定位导致崩溃的代码行。## 4. 网络调试命令### 4.1tcpdump网络抓包分析tcpdump是网络调试的瑞士军刀可以捕获并分析网络数据包。bash# 捕获所有经过 eth0 网卡的 HTTP 请求80端口sudo tcpdump -i eth0 port 80# 保存到文件供后续分析sudo tcpdump -i eth0 -w capture.pcap# 读取 pcap 文件显示详细信息tcpdump -r capture.pcap -X # -X 显示十六进制和 ASCII 内容# 捕获特定主机的流量sudo tcpdump -i eth0 host 192.168.1.100实战案例排查 Web 服务响应慢的问题用tcpdump -i eth0 port 80捕获请求观察SYN、ACK包的间隔时间判断是网络延迟还是应用处理慢。### 4.2netstat与ss网络连接与端口ss是netstat的现代替代品速度更快信息更全。bash# 查看所有监听端口ss -tlnp# 查看所有 TCP 连接包括状态ss -tanp# 查看特定端口的连接如 8080ss -tanp | grep :8080# 传统的 netstat 命令netstat -tulnp实战案例当端口被占用时使用ss -tlnp | grep :8080找到占用端口的进程 PID然后用ps -p PID -o comm查看进程名称。## 5. 文件系统与 I/O 调试### 5.1iostat磁盘 I/O 性能bash# 查看磁盘 I/O 统计每 2 秒刷新一次共 3 次iostat -x 2 3# 关注 %util磁盘使用率和 await平均 I/O 等待时间# 如果 %util 接近 100%说明磁盘是瓶颈### 5.2lsof文件描述符查看bash# 查看某个进程打开的文件lsof -p 1234# 查看某个端口被哪个进程占用lsof -i :8080# 查看某个文件被哪些进程打开lsof /var/log/syslog实战案例当删除文件时提示“设备或资源忙”用lsof /path/to/file找到占用该文件的进程然后决定是否终止它。## 6. 实战综合调试示例下面是一个完整的 Python 脚本模拟内存泄漏和 CPU 密集型任务用 Linux 命令进行调试。python#!/usr/bin/env python3# 文件名debug_demo.py# 功能模拟内存泄漏和CPU密集型任务用于演示调试命令import timeimport threading# 全局列表模拟内存泄漏leak_list []def leak_memory(): 每2秒分配1MB内存模拟内存泄漏 while True: leak_list.append( * 1024 * 1024) # 分配1MB print(fAllocated memory, current size: {len(leak_list)} MB) time.sleep(2)def cpu_intensive(): 无限循环消耗CPU x 0 while True: x 1 if x % 10000000 0: print(CPU intensive work...)if __name__ __main__: # 启动两个线程 t1 threading.Thread(targetleak_memory, daemonTrue) t2 threading.Thread(targetcpu_intensive, daemonTrue) t1.start() t2.start() # 主线程保持运行 try: while True: time.sleep(1) except KeyboardInterrupt: print(Exiting...)调试步骤1. 运行脚本python3 debug_demo.py 2. 用top -p $(pgrep -f debug_demo.py)观察 CPU 和内存占用。3. 用strace -p $(pgrep -f debug_demo.py)跟踪系统调用。4. 用lsof -p $(pgrep -f debug_demo.py)查看文件描述符。5. 用kill -9 PID强制终止异常进程。## 总结本文从实战角度出发系统总结了 Linux 下常用的 Debug 命令包括进程监控top、ps、系统调用跟踪strace、ltrace、内存调试valgrind、gdb、网络分析tcpdump、ss以及文件 I/O 调试iostat、lsof。通过大量可运行的代码示例读者可以快速将这些命令应用到实际工作中。记住Debug 的核心在于观察——观察系统状态、观察进程行为、观察网络流量。熟练使用这些命令就像拥有了一把打开问题黑盒的钥匙。建议读者在实际环境中多动手实践结合man命令查看每个工具的详细文档逐步提升自己的调试能力。