1. 引言
此前的文章中我们介绍了 tcpdump 的实用技巧:
计算机网络问题排查(一) -- tcpdump 原理与基础参数
实战计算机网络问题排查(二) -- tcpdump 的过滤指令
tcpdump 作为计算机网络排查的一大神器,掌握了上文所说的技巧,可以让你随时随地得心应手的掌握网络应用的一举一动。
那么,除了得知一个应用正在做着什么样的网络通信,有没有办法知道一个正在运行中的进程到底做了什么呢?
答案当然是可以了,linux 命令 strace 就是跟踪进程行为的一大神器,你可以通过它知道正在执行的进程中到底发生了什么,以及程序为什么出现错误等等。
本文,我们就来详细介绍一下 strace 的十大用法。
2. strace 的安装
如今,linux 几乎都有成熟的包管理机制,strace 的安装也因此变得非常简单:
- ubuntu/Debian 系统
sudo apt install strace
- RHEL/CentOS 系统
yum install strace
- Fedora 系统
dnf install strace
3. 追踪 linux 系统调用
只要在原本命令的前面,加上 strace 关键字,我们就可以看到原本要执行的这个命令到底做了什么,下面就是一个追踪 df 命令的例子:
$ strace df -h execve("/bin/df", ["df", "-h"], [/* 50 vars */]) = 0 brk(NULL) = 0x136e000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f82f78fd000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=147662, ...}) = 0 mmap(NULL, 147662, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f82f78d8000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 read(3, "177ELF2113 3 >